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

Timothy Bish closed AMQ-1217.
-----------------------------

    Resolution: Not A Problem

Workaround provided in the issue comments.

> Message Bridge to Weblogic 9.2 results in Null JMS Destination
> --------------------------------------------------------------
>
>                 Key: AMQ-1217
>                 URL: https://issues.apache.org/jira/browse/AMQ-1217
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 4.1.0
>            Reporter: Aman Nanner
>             Fix For: NEEDS_REVIEWED
>
>         Attachments: WLSToActiveMQMessageConverter.java, 
> patchAMQ-1217-NPE-CompositeDestinationBroker.diff
>
>
> Hi,
> I have created an inbound message bridge from Weblogic Server 9.2 into Apache 
> Geronimo 1.2 (Apache Active MQ 4.1-SNAPSHOT).  The actual "bridge" works 
> fine, as the message is forwarded from Weblogic Server into Apache ActiveMQ.  
> However, a NullPointerException occurs during processing of the message:
> ---
> {code:title=Bar.java|borderStyle=solid}
> 11:15:40,885 ERROR [DestinationBridge] failed to forward message on attempt: 
> 1 reason: javax.jms.JMSException: java.lang.NullPointerException message: 
> TextMessage[ID:Sphinx-3592-1175266963549-3:1:3:1:5, <test>Hello World</test>]
> javax.jms.JMSException: java.lang.NullPointerException
>       at 
> org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:46)
>       at 
> org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1181)
>       at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1551)
>       at 
> org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:465)
>       at 
> org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:415)
>       at 
> org.apache.activemq.ActiveMQQueueSender.send(ActiveMQQueueSender.java:116)
>       at 
> org.apache.activemq.network.jms.QueueBridge.sendMessage(QueueBridge.java:87)
>       at 
> org.apache.activemq.network.jms.DestinationBridge.onMessage(DestinationBridge.java:134)
>       at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:4060)
>       at weblogic.jms.client.JMSSession.execute(JMSSession.java:3953)
>       at 
> weblogic.jms.client.JMSSession$UseForRunnable.run(JMSSession.java:4467)
>       at 
> weblogic.work.ExecuteRequestAdapter.execute(ExecuteRequestAdapter.java:21)
>       at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:145)
>       at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:117)
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.activemq.broker.CompositeDestinationBroker.send(CompositeDestinationBroker.java:86)
>       at 
> org.apache.activemq.broker.MutableBrokerFilter.send(MutableBrokerFilter.java:136)
>       at 
> org.apache.activemq.broker.TransportConnection.processMessage(TransportConnection.java:498)
>       at 
> org.apache.activemq.command.ActiveMQMessage.visit(ActiveMQMessage.java:604)
>       at 
> org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:294)
>       at 
> org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:185)
>       at 
> org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:95)
>       at 
> org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:65)
>       at 
> org.apache.activemq.transport.vm.VMTransport.syncOneWay(VMTransport.java:96)
>       at 
> org.apache.activemq.transport.vm.VMTransport.oneway(VMTransport.java:83)
>       at 
> org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:47)
>       at 
> org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:69)
>       at 
> org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:74)
>       at 
> org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1175)
>       ... 12 more
> {code}
> ---
> Here is the method in 
> {{org.apache.activemq.broker.CompositeDestinationBroker}} where the 
> NullPointerException occurs:
> ----
> {code:title=Bar.java|borderStyle=solid}
>     public void send(ConnectionContext context, Message message) throws 
> Exception {
>         ActiveMQDestination destination = message.getDestination();
>         if( destination.isComposite() ) {
>             ActiveMQDestination[] destinations = 
> destination.getCompositeDestinations();
>             for (int i = 0; i < destinations.length; i++) {
>                 if( i!=0 ) {
>                     message = message.copy();
>                 }
>                 message.setOriginalDestination(destination);
>                 message.setDestination(destinations[i]);
>                 message.evictMarshlledForm();
>                 next.send(context, message);
>             }
>         } else {
>             next.send(context, message);
>         }
>     }
> {code}
> ----
> The {{message.getDestination()}} method call returns null because the JMS 
> Destination inside the message is set to null.  I then investigated why this 
> message would be set to null, and I traced the problem to the following 
> method in {{org.apache.activemq.ActiveMQSession}}:
> ----
> {code:title=Bar.java|borderStyle=solid}
>     protected void send(ActiveMQMessageProducer producer, ActiveMQDestination 
> destination, Message message, int deliveryMode,
>             int priority, long timeToLive) throws JMSException {
>         checkClosed();
>         if( destination.isTemporary() && connection.isDeleted(destination) ) {
>             throw new JMSException("Cannot publish to a deleted Destination: 
> "+destination);
>         }
>         // tell the Broker we are about to start a new transaction
>         doStartTransaction();
>         TransactionId txid = transactionContext.getTransactionId();
>         
>         message.setJMSDestination(destination);
>         message.setJMSDeliveryMode(deliveryMode);        
>         long expiration = 0L;
>         if (!producer.getDisableMessageTimestamp()) {
>             long timeStamp = System.currentTimeMillis();
>             message.setJMSTimestamp(timeStamp);
>             if (timeToLive > 0) {
>                 expiration = timeToLive + timeStamp;
>             }
>         }
>         message.setJMSExpiration(expiration);
>         message.setJMSPriority(priority);
>         long sequenceNumber = producer.getMessageSequence();
>         
>         message.setJMSRedelivered(false);        
>         // transform to our own message format here
>         ActiveMQMessage msg = 
> ActiveMQMessageTransformation.transformMessage(message, connection);
>         // Set the message id.
>         if( msg == message ) {
>             msg.setMessageId( new 
> MessageId(producer.getProducerInfo().getProducerId(), sequenceNumber) );
>         } else {
>             msg.setMessageId( new 
> MessageId(producer.getProducerInfo().getProducerId(), sequenceNumber) );
>             message.setJMSMessageID(msg.getMessageId().toString());
>         }
>         
>         msg.setTransactionId(txid);
>         if ( connection.isCopyMessageOnSend() ){
>             msg = (ActiveMQMessage) msg.copy();
>         }
>         msg.setConnection(connection);
>         msg.onSend();
>         msg.setProducerId(msg.getMessageId().getProducerId());
>         if (log.isDebugEnabled()) {
>             log.debug("Sending message: " + msg);
>         }
>         if( !connection.isUseSyncSend() && ( !msg.isPersistent() || 
> connection.isUseAsyncSend() || txid!=null) ) {
>             this.connection.asyncSendPacket(msg);
>         } else {
>             this.connection.syncSendPacket(msg);
>         }
>     }
> {code}
> ----
> As you can see, the destination is supposed to be set in the message during 
> the call {{message.setJMSDestination(destination);}}.  I have verified that 
> the destination argument is indeed valid and NOT null.  However, after this 
> method invocation, the internal JMS destination within the "message" object 
> is STILL null.
> This "message" object is in fact the Weblogic JMS implementation of the 
> "Message" interface.  So it seems that the Weblogic implementation of the 
> object is not properly setting the JMS destination for whatever reason.  
> Therefore, when the message is transformed in the following call:
> {{ActiveMQMessage msg = 
> ActiveMQMessageTransformation.transformMessage(message, connection);}}
> the new ActiveMQMessage object will have a null destination, thus causing a 
> NullPointerException further down the chain.
> It may be that the fact that the JMS destination is not being set in the 
> Weblogic JMS class is a Weblogic bug, but I'm wondering if Apache ActiveMQ 
> should anticipate this somehow, and still be able to deliver the JMS message.
> Thanks

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to