Is there any way to set a JMS message property within a JAX-WS handler? I am trying to set a custom property on the message, to be used by a MDB message selector.
I've tried setting the properties on the SOAPMessage within a SOAPHandler, but that doesn't work so I think those properties may be at a different level that does not apply to the message selector. And it doesn't work if I put the property in the BindingProvider's requestContext either.
For anyone reading this in the future: I was able to find a way to set JMS properties within a handler, but it appeared that the IBM generated MDB code was actually removing those properties. You may have to ditch the JMSListenerMDB in order to solve this issue.
Related
I have to use JMS in order to send messages with IBM MQ queues. The libraries used are
javax.jms.*
Everything works as expected. Unfortunately the queue itself needs advanced properties set on the MQMD (message descriptor). To do so you would have to enable them first on a destination with
((JmsDestination) destination).setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);
which uses the
import com.ibm.msg.client.jms.JmsDestination;
library. Due to technical reasons I am not allowed to use these libraries. Is there a way to get this working with the standard javax libraries?
The only MQMD fields I need to define manually is the replyToQueueManager and the UserId
Edit: I can get it working with reflections but still some fields are not set as expected
I have to change the namespace of the incoming messages to our webservice.
The consumer route looks like the following:
from("cxf:/myservice?serviceClass=myServiceClass")...
I've tried to add somehow an interceptor to this(parameter properties.in, properties.inInterceptors?), but I don't get it how to configure it to my route.
We are not configuring our cxf endpoints in spring so I have to solve it with additional parameters to the route.
I think an interceptor with the transformation feature mentioned in the cxf documentation is the right solution, but I was not able to configure it correctly.
How can I add an interceptor to the route?
Or is there another way to change the namespace of the incoming message?
kind regards,
soilworker
I've found a solution:
It is possible to say something like from(endpoint), so I've created an instance of CxfEndpoint and there I can set the cxfEndpointConfigurer.
In this configurer I can add an interceptor which removes the namespace(see transformation feature of cxf).
Maybe it also works somehow with the from(uri) syntax, but I don't know how.
Im developping non OSGI app and i need to update the values of some properties used in camel routes (loaded BridgePropertyPlaceHolder).
So I thought:
To use Hawtio, the cool mangement console, in order update camel using JMX
Create a JMX MBean that will update the properties ..
I successfully create the MBean operations and call them using JMX, but I can't figure out how to update the camel routes that depends on these properties.
Is there a way to update the camel context externally?
Update:
Exemple of use case:when a remote server doesn't return response, we keep sending messages until we reach the max of unsuccessful attempt(messages without ack).
in camel we create a router pattern based on property loaded from file system.
This property can change occasionally, and we want to do this without restarting server, but the problem is that camel parse routes when starting context and i can't find no mean to update routes accordingly.
I am grateful for any proposal that could help:)
If you use Camel error handling to retry (redeliver) then you can use the retryWhile to keep retrying until you return false. This allows you to use java code etc, and that allows you to read the updated configuration option.
See more details at
http://camel.apache.org/exception-clause.html
And if you have a copy of Camel in Action book, see page 152
For what properties you want them to be dynamic.you can move those prop to some db and fetch them whenever you are reading.I think a redesign is required for your camel route.
Changing from endpoint parameters such as URLs etc., following procedure has to be used according to dynamic change endpoint camel:
stop the route
remove the route
change the endpoint
add the route
start the route
If the to endpoint has to be configurable, you may use the recipient list component. Here you may read properties from a database and/or from the filesystem using the appropriate Camel component.
I have traditional (com.ibm.mq.jar) MQ application in Java for testing purpose. Now I need to use that application to send some messages to JMS. When I try to set any JMS property on MQ message, for example:
message.setStringProperty("JMSDestination", "queue:///" + queueName);
I always get error: 2471 - MQRC_PROPERTY_NOT_AVAILABLE. It works if I just remove JMS from the property name.
Is it possible to set JMS properties directly on MQMessage? What is a correct way to do that on MQ level?
Btw. I have the same application in .NET where setting JMS properties this way is possible so I'm only trying to use the same code in Java.
It is not allowed to do this manually. Please use the JMS API to set JMS properties.
Restrictions to MQ properties are explained here.
One thing is interessting in that document page though,
The names of properties specified directly as MQRFH2 elements are not guaranteed to be validated by the MQPUT call.
You could perhaps work around this, on a short term basis. There seems to be no guarantee that setting the MQRFH2 elements directly will not be validated, though.
I have an enterprise application running on JBoss which contains a number of message driven beans. At the moment, each MDB listens for messages from a destination which is defined via annotations on the MDB class.
Is it possible to set the detination that MDBs subcribe to at runtime, rather than configuring this via annotations of a deployment descriptor?
Many thanks.
Generally you can't reconfigure existing MDB to listen another queue, but you can try this method to specify system properties instead of real queue names. System properties can be changed in runtime through JMX