You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Martin Ritchie (JIRA)" <qp...@incubator.apache.org> on 2009/03/02 18:14:56 UTC

[jira] Resolved: (QPID-1623) Setting JMSReplyTo field to NULL causes IllegalArgumentException to be thrown

     [ https://issues.apache.org/jira/browse/QPID-1623?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Martin Ritchie resolved QPID-1623.
----------------------------------

    Resolution: Fixed

Changes look good. 

> 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-subscribe@qpid.apache.org