[
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