I had exactly same problem few months ago and came up with quick and dirty
solution.
By default all attributes on Camel JMS URI (ex. targetClient for Websphare
MQ) are are passed to camel JmsComponent object. Such behavior is not what
we want in case of additional destination attributes (like MS MQ
'targetClient'). But in JmsComponent object there is method:
protected String convertPathToActualDestination(String path, Map
parameters)
which overloaded can modify this behavior. There is extended JmsComponent
code. Please find more description in supplied javadoc snippet:
// -------------------
/**
* JMSComponent with modification that allows setting attributes on JMS
destination object.<br/>
* Attributes enumerated in 'destinationArgs' attribute will be set as
attributes on destination URI instead on underlying [EMAIL PROTECTED]
JmsComponent}
object.
* For example setting 'targetClient' attribute on Webshere MQ in Camel JMS
endpoint URI should look like:
*
<pre>jmsMqComp:queue:queue://queue_name?destinationArgs=targetClient&targetClient=1</pre>
* where jmsMqComp is bean id of [EMAIL PROTECTED]
JmsComponentWithDestinationAttributes} instance.<br/>
* (Please note URI attribute setting method on Websphere MQ works only with
URI queue format - thats the reason
* there is keyword 'queue' is used twice in this example - first is from
Camel URI format, second starts WS MQ queue URI)
*/
public class JmsComponentWithDestinationAttributes extends JmsComponent {
private Log log =
LogFactory.getLog(JmsComponentWithDestinationAttributes.class);
@Override
protected String convertPathToActualDestination(String path, Map
parameters) {
if (log.isDebugEnabled())
log.debug("resolve: [path: "+path+"][parameters: "+parameters+"]");
String subject = super.convertPathToActualDestination(path, parameters);
// attributes enumerated in 'destinationArgs' are removed from map and
appended as destination options
if (parameters.containsKey("destinationArgs")) {
StringBuffer subjectBuf = new StringBuffer(subject);
boolean subjectHasOptions = (subject.indexOf('?')!=-1);
String destinationArgs = (String)
parameters.remove("destinationArgs");
String[] args = destinationArgs.split(",");
for (String arg : args) {
if (subjectHasOptions) {
subjectBuf.append("&");
} else {
subjectBuf.append("?");
subjectHasOptions = true;
}
subjectBuf.append(arg);
subjectBuf.append('=');
subjectBuf.append((String) parameters.remove(arg));
}
subject = subjectBuf.toString();
}
if (log.isDebugEnabled())
log.debug("resolved [path: "+subject+"][parameters: "+parameters+"]");
return subject;
}
}
// -------------------
and assuming Spring bean configuration:
<bean id="jmsMqComp"
class="com.somecompany.JmsComponentWithDestinationAttributes">
<property name="connectionFactory">
<bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="transportType">
<util:constant
static-field="com.ibm.mq.jms.JMSC.MQJMS_TP_CLIENT_MQ_TCPIP"/>
</property>
<property name="hostName" value="mq_host"/>
<property name="port" value="mq_port" />
<property name="queueManager" value="mq_qmanager"/>
<property name="channel" value="mq_channel"/>
</bean>
</property>
</bean>
JMS URI in Camel:
jmsMqComp:queue:queue://queue_name?destinationArgs=targetClient&targetClient=1
will set targetClient=1 option on WS MQ destination.
It's definitely not best solution. ActiveMQ has dedicated component in Camel
which accepts many AMQ dedicated options. Maybe this is way to go for
Websphere MQ also ?
--
View this message in context:
http://www.nabble.com/Camel-to-Websphere-MQ-communication-tp20834360s22882p20879636.html
Sent from the Camel - Users mailing list archive at Nabble.com.