activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matthias Hanisch <matthias.hani...@camline.com>
Subject Re: How to put "properties" on a message so they are accessible later
Date Wed, 11 Oct 2017 08:46:03 GMT
Hi,

let me explain a similar use case what we would use to show that there is a
demand for modification of application properties:

We would like to enrich an AMQP message with additional application
properties for better filtering and message routing.

As far as I understood from the discussion below this is not possible by
calling
message.putStringProperty("new_prop", "new_prop_value")

I tried to do this in an AmqpInterceptor but the listener still gets the
original message without this added property. And therefore the listener
can also not create a message selector based on the new application
properties.

I also checked the spec and I could not find a reference that application
properties are immutable. For "pure" properties this seems to be true
according to section 3.2.4 of the spec.

The only way I can think of is to use a listener which creates a new
message with the enriched context and uploads it back to the broker. This
would duplicate a lot of messages and would impact performance.

A more efficient way to realize this feature would be greatly appreciated.

Best regards,
Matthias

P.S.: I just subscribed to this mailing list so I was not able to reply
directly to the mail below. Sorry about that.


---------- Weitergeleitete Nachricht ----------
> From: Clebert Suconic <clebert.suconic@gmail.com>
> To: users@activemq.apache.org
> Cc:
> Bcc:
> Date: Tue, 10 Oct 2017 20:18:38 -0400
> Subject: Re: How to put "properties" on a message so they are accessible
> later
> We could add a new method call to the plugin... something like
> replaceMessage.
>
> With that on hand you could then convert the AMQPMessage to a Core
> Message using message.toCore().. and return the transformed message.
>
>
> The message wouldn't be an AMQP message any longer from that point
> on.. it would eventually be converted back to whatever other message
> protocols it leads on the other side...  it would of course have some
> performance impact but it would work.
>
> On Tue, Oct 10, 2017 at 5:55 PM, Timothy Bish <tabish121@gmail.com> wrote:
> > On 10/10/2017 05:20 PM, Harrison Tarr wrote:
> >>
> >> Thanks for the quick reply. Is there any way to change something on the
> >> message that my consumer could then access? Maybe not
> ApplicationProperties
> >> but something else?
> >
> >
> > Nothing that would be accessible via the JMS client API.
> >
> >
> >> Harrison
> >>
> >> -----Original Message-----
> >> From: Timothy Bish [mailto:tabish121@gmail.com]
> >> Sent: Tuesday, October 10, 2017 2:11 PM
> >> To: users@activemq.apache.org
> >> Subject: Re: How to put "properties" on a message so they are accessible
> >> later
> >>
> >> On 10/10/2017 05:06 PM, Harrison Tarr wrote:
> >>>
> >>> Hello again,
> >>>
> >>> I wanted to follow up on this as I've done some more experimenting.
> >>> I've found that when I use the Core protocol or Openwire protocol,
> >>> everything works as expected. I am able to use the "setStringProperty"
> >>> in my ActiveMQServerPlugin and it adds a header that I can then access
> >>> in my Camel consumer code. However, if I try to add a property to a
> >>> message that was sent using the AMQP protocol, it does not stay set on
> >>> the message. It appears to me that this is because the AMQP message is
> >>> more protected? Maybe it has all of the data in an immutable
> >>> ByteBuffer? I've tried using the "reencode" method on the
> >>> org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage class,
> >>> but it causes an error; it can't parse the message back out, it says
> >>> something about an unknown constructor. (Being handled here
> >>> https://github.com/apache/qpid-jms/blob/master/qpid-jms-client/src/mai
> >>> n/java/org/apache/qpid/jms/provider/amqp/AmqpConsumer.java#L496)
> >>
> >> AMQP ApplicationProperties are immutable so you cannot change or add to
> >> them in flight, that would violate the AMQP specification.
> >>
> >>> Justin, I've looked at the remoting interceptors. I think I decided
> >>> against using them because it does not expose as much information to
> me as I
> >>> wanted. I'm specifically trying to take the authentication credentials
> and
> >>> then create some kind of authentication token to attach to the message
> that
> >>> I can then use in my consuming code.
> >>>
> >>> Regards,
> >>> Harrison Tarr
> >>>
> >>>
> >>> -----Original Message-----
> >>> From: Justin Bertram [mailto:jbertram@redhat.com]
> >>> Sent: Tuesday, September 12, 2017 3:28 PM
> >>> To: users@activemq.apache.org
> >>> Subject: Re: How to put "properties" on a message so they are
> >>> accessible later
> >>>
> >>> I'm not terribly familiar with the ActiveMQServerPlugin functionality
> in
> >>> this regard, but I do know that you can make such modifications to
> messages
> >>> using remoting interceptors.  Have you explored that possibility?
> >>>
> >>>
> >>> Justin
> >>>
> >>> On Tue, Sep 12, 2017 at 3:45 PM, Harrison Tarr
> >>> <harrison.tarr@connexta.com>
> >>> wrote:
> >>>
> >>>> Right now I'm using Artemis 2.2.0.
> >>>> I've done a bit more research and experimentation. It seems that I
> >>>> can set a header in Camel, send the message to a queue/topic hosted
> >>>> on Artemis and read the header as a "stringProperty". The header keys
> >>>> also show up when I do a "getProperties" call. However, if I try to
> >>>> overwrite that field in my ActiveMQServerPlugin (specifically the
> >>>> beforeSend call), the change is not propagated to Camel. IE, if I
> send a
> >>>> message with the header "testHeader"
> >>>> with a value of "testValue", I can see, in Artemis, "testHeader" as
a
> >>>> property on the message with the value of "testValue". If I then try
> >>>> to overwrite that value with "newValue", when I access the message
> >>>> and its headers in the consumer, the header is still "testHeader"
> >>>> with the value of "testValue", whereas I expect it to be "testHeader"
> >>>> with a value of "newValue".
> >>>>
> >>>> Harrison Tarr
> >>>>
> >>>> -----Original Message-----
> >>>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim
> >>>> Bain
> >>>> Sent: Monday, September 11, 2017 6:26 PM
> >>>> To: ActiveMQ Users <users@activemq.apache.org>
> >>>> Subject: RE: How to put "properties" on a message so they are
> >>>> accessible later
> >>>>
> >>>> To be clear, you're asking about doing this in Artemis, not ActiveMQ
> >>>> 5.x, right? What version of Artemis?
> >>>>
> >>>> On Sep 11, 2017 2:48 PM, "Harrison Tarr" <harrison.tarr@connexta.com>
> >>>> wrote:
> >>>>
> >>>>> I just wanted to follow up: Does anyone know how to put an
> >>>>> attribute/property on a message in an ActiveMQServerPlugin that
I
> >>>>> can then pull out of the message in Camel?
> >>>>>
> >>>>> Regards,
> >>>>> Harrison Tarr
> >>>>>
> >>>>> -----Original Message-----
> >>>>> From: Harrison Tarr [mailto:harrison.tarr@connexta.com]
> >>>>> Sent: Wednesday, September 6, 2017 8:56 AM
> >>>>> To: users@activemq.apache.org
> >>>>> Subject: How to put "properties" on a message so they are accessible
> >>>>> later
> >>>>>
> >>>>> Hi,
> >>>>>
> >>>>> I'm trying to put a StringProperty on a Message in an
> >>>>> ActiveMQServerPlugin. As far as I can tell, the property gets set
> >>>>> correctly. Later, I'm trying to retrieve the property from a Camel
> >>>>> Exchange. I don't see my property anywhere on the Exchange. I did
> >>>>> notice that it looks like the properties "firedTime" and
> >>>>> "breadcrumbId," which I think come from Artemis, do appear on the
> >>>>> Camel Exchange, which makes me think there is some way to propagate
> >>>>> my
> >>>>
> >>>> property from Artemis to Camel.
> >>>>>
> >>>>> Regards,
> >>>>> Harrison Tarr
> >>>>>
> >> --
> >> Tim Bish
> >> twitter: @tabish121
> >> blog: http://timbish.blogspot.com/
> >>
> >
> > --
> > Tim Bish
> > twitter: @tabish121
> > blog: http://timbish.blogspot.com/
> >
>
>
>
> --
> Clebert Suconic
>
>
>

-- 
camLine GmbH
85238 Petershausen, Industriering 4a, Deutschland
Amtsgericht München HRB 88821
Geschäftsführer: Heinz Linsmaier (CEO), Bernhard Jofer, Georg Ruetz
<http://www.camline.com/en/camline/events.html>
<http://www.camline.com/en/camline/events.html> 
<http://www.camline.com/en/camline/events.html>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message