activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Aman Nanner (JIRA)" <j...@apache.org>
Subject [jira] Created: (AMQ-1217) Message Bridge to Weblogic 9.2 results in Null JMS Destination
Date Fri, 30 Mar 2007 15:39:34 GMT
Message Bridge to Weblogic 9.2 results in Null JMS Destination
--------------------------------------------------------------

                 Key: AMQ-1217
                 URL: https://issues.apache.org/activemq/browse/AMQ-1217
             Project: ActiveMQ
          Issue Type: Bug
          Components: Broker
    Affects Versions: 4.1.0
            Reporter: Aman Nanner


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.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message