You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Timothy Bish (JIRA)" <ji...@apache.org> on 2011/07/08 23:07:17 UTC

[jira] [Closed] (AMQ-1217) Message Bridge to Weblogic 9.2 results in Null JMS Destination

     [ 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