[ https://issues.apache.org/jira/browse/QPID-1623?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Aidan Skinner reassigned QPID-1623: ----------------------------------- Assignee: Martin Ritchie (was: Aidan Skinner) > Setting JMSReplyTo field to NULL causes IllegalArgumentException to be thrown > ----------------------------------------------------------------------------- > > Key: QPID-1623 > URL: https://issues.apache.org/jira/browse/QPID-1623 > Project: Qpid > Issue Type: Improvement > Components: Java Client > Affects Versions: M1, M2, M2.1, M3, M4 > Reporter: Marnie McCormack > Assignee: Martin Ritchie > Fix For: M5 > > > Qpid versions 2.2.2.0 > Platform: Windows > JDK: 16.0_11 > I came across this problem while trying to write an example application for > one of our MAF clients that would take part in a JMS request-response message > flow. > During testing of this I started hitting this IllegalArgumentException from > Qpid exception: > java.lang.IllegalArgumentException: Null destination not allowed > at > org.apache.qpid.client.message.AbstractJMSMessage.setJMSReplyTo(AbstractJMSMessage.java:200) > > at > org.mule.providers.jms.JmsReplyToHandler.processReplyTo(JmsReplyToHandler.java:79) > > at org.mule.impl.model.DefaultMuleProxy.onCall(DefaultMuleProxy.java:297) > at org.mule.impl.model.seda.SedaComponent.doSend(SedaComponent.java:406) > at > org.mule.impl.model.AbstractComponent.sendEvent(AbstractComponent.java:407) > at org.mule.impl.MuleSession.sendEvent(MuleSession.java:349) > at > org.mule.routing.inbound.InboundRouterCollection.send(InboundRouterCollection.java:197) > > at > org.mule.routing.inbound.InboundRouterCollection.route(InboundRouterCollection.java:163) > > at > org.mule.providers.AbstractMessageReceiver$DefaultInternalMessageListener.onMessage(AbstractMessageReceiver.java:585) > > at > org.mule.providers.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:322) > > at > org.mule.providers.AbstractReceiverWorker$1.doInTransaction(AbstractReceiverWorker.java:107) > > at > org.mule.transaction.TransactionTemplate.execute(TransactionTemplate.java:98) > at > org.mule.providers.AbstractReceiverWorker.doRun(AbstractReceiverWorker.java:124) > > at > org.mule.providers.AbstractReceiverWorker.run(AbstractReceiverWorker.java:60) > at org.mule.impl.work.WorkerContext.run(WorkerContext.java:310) > at org.mule.impl.work.SyncWorkExecutor.doExecute(SyncWorkExecutor.java:39) > at org.mule.impl.work.MuleWorkManager.executeWork(MuleWorkManager.java:277) > at org.mule.impl.work.MuleWorkManager.doWork(MuleWorkManager.java:169) > at > org.mule.providers.jms.MultiConsumerJmsMessageReceiver$SubReceiver.onMessage(MultiConsumerJmsMessageReceiver.java:281) > > at > org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:719) > > at > org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:656) > > at > org.apache.qpid.client.AMQSession$Dispatcher.dispatchMessage(AMQSession.java:3043) > > at org.apache.qpid.client.AMQSession$Dispatcher.run(AMQSession.java:2966) > After doing some digging through the Mule code I was able to track it down to > the following piece of code in Mule's JmsReplyToHandler where it tries to set > the JMSReplyTo field to be null. > final boolean topic = > connector.getTopicResolver().isTopic(replyToDestination); > session = connector.getSession(false, topic); > Message replyToMessage = JmsMessageUtils.toMessage(payload, session); > replyToMessage.setJMSReplyTo(null); > if (logger.isDebugEnabled()) > { > logger.debug("Sending jms reply to: " + replyToDestination + "(" > + replyToDestination.getClass().getName() + ")"); > } > replyToProducer = connector.getJmsSupport().createProducer(session, > replyToDestination, topic); > The corresponding code in qpid (taken from the AbstractJMSMessage class) > shows that qpid throws the IllegalArgumentException whenever it receives a > null value: > public void setJMSReplyTo(Destination destination) throws JMSException > { > if (destination == null) > { > throw new IllegalArgumentException("Null destination not > allowed"); > } > if (!(destination instanceof AMQDestination)) > { > throw new IllegalArgumentException( > "ReplyTo destination may only be an AMQDestination - > passed argument was type " + destination.getClass()); > } > final AMQDestination amqd = (AMQDestination) destination; > final AMQShortString encodedDestination = amqd.getEncodedName(); > _destinationCache.put(encodedDestination, destination); > getContentHeaderProperties().setReplyTo(encodedDestination); > } > The JMS Spec is a bit vague around whether or not you can actually set this > JMSReplyTo value to null or not but after talking with Martin about this he > was able to check both the Qpid and MQ code to see how they compared. While > the Qpid code disallows setting a null value on the JMSReplyTo field the MQ > code is more forgiving and allows Null values to be set. I've included the > JMSReplyTo section from the JMS Spec below. > ----- > 3.4.6 JMSReplyTo > The JMSReplyTo header field contains a Destination supplied by a client when > a message is sent. It is the destination where a reply to the message should > be sent. > Messages sent with a null JMSReplyTo value may be a notification of some > event or they may just be some data the sender thinks is of interest. > Messages sent with a JMSReplyTo value are typically expecting a response. A > response may be optional; it is up to the client to decide. > ----- > Ideally I would like for this null check in the qpid code to be removed if > possible as at the moment it's stopping me from using qpid for this example > for one of our clients. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org