You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Nigel Tamplin (JIRA)" <ji...@apache.org> on 2011/08/22 15:19:29 UTC

[jira] [Commented] (AMQ-3369) occasionally NPE in ActiveMQTextMessage.getSize()

    [ https://issues.apache.org/jira/browse/AMQ-3369?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13088678#comment-13088678 ] 

Nigel Tamplin commented on AMQ-3369:
------------------------------------

I was also seeing this error in a high load system with embedded AMQ,  but was unable to reproduce in a small / simple test case.

The exception was originating from a single thread with a transacted session, running in a bigger application (a subtle timing issue?).
The thread was creating TextMessages from external events, sending to a queue then committing the session, shortly after the same thread would read back from that queue and send to another queue then commit again.
It was the send to the 2nd queue that would very occasionally throw the NullPointer.  In 30 – 40 thousand iterations over a 12 hour period I'd see the NullPointer maybe 20 times.  I could not however contrive a test case to reliably reproduce it.

What I could do however was to put the JVM in debug mode and catch the NullPointer.

What I found was

public int getSize() {
        if (size  0 && content  null && text != null) {
            size = getMinimumMessageSize();
            if (marshalledProperties != null) {
                size += marshalledProperties.getLength();
            }
            size = text.length() * 2;        <<<< null pointer thrown here
        }
        return super.getSize();
    }

Exception occurred: java.lang.NullPointerException (to be caught at: org.apache.activemq.ActiveMQSession.send(), line=1,700 bci=447)"thread=Thread 50", org.apache.activemq.command.ActiveMQTextMessage.getSize(), line=148 bci=57
148                size = text.length() * 2;

MQ IN SMA.TEST.ORBITAL.01.CT/MQ_LOOP_BACK.1[1] list
144                size = getMinimumMessageSize();
145                if (marshalledProperties != null) {
146                    size += marshalledProperties.getLength();
147                }
148 =>             size = text.length() * 2;
149            }
150            return super.getSize();
151        }
152        
153        public String toString() {
Thread 50[1] print text
 text = null

Since the check that text != null and the accessing of text it was being set to null.

I was running version 5.3.0, and suspected the cause of the NullPointer to be the
	text = null;
assignment at the end of the beforeMarshall() method in ActiveMQTextMessage.  This looks to be the only place it could be set to null.

See 
https://issues.apache.org/jira/browse/AMQ-2103
https://issues.apache.org/jira/browse/AMQ-2966

The “text = null;” assignment is present in AMQ versions 5.3.0, 5.3.1, 5.3.2, 5.4.0, 5.4.1
and removed in 5.4.2 and subsequence versions.

Unable to upgrade to 5.4.2 (or newer) in the short term, but needing to avoid this problem immediately I rebuilt 5.3.0 removing the “text=null;” assignment and have not experienced the NullPointerException since.

> occasionally NPE in ActiveMQTextMessage.getSize()
> -------------------------------------------------
>
>                 Key: AMQ-3369
>                 URL: https://issues.apache.org/jira/browse/AMQ-3369
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.4.1
>         Environment: JDK 1.6 (64-bit), Windows Server 2008 x64
>            Reporter: Ivan Pechorin
>
> Sometime we get NullPointerException when sending a text message. We use method send(destination, message) of interface javax.jms.MessageProducer.
> java.lang.NullPointerException
>  at org.apache.activemq.command.ActiveMQTextMessage.getSize(ActiveMQTextMessage.java:148)
>  at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1753)
>  at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:231)
>  at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:300)
> Caller code is:
> try {
>     final TextMessage message = session.createTextMessage(msg);
>     message.setJMSType(type);
>     message.setJMSReplyTo(destination);
>     message.setJMSCorrelationID(jmsMessageId);
>     producer.send(destination, message);
> } catch (JMSException ex) {
>     ...
> }
> I.e. we don't reuse or store the message being sent.
> We are also 100% sure that both session and its producer are used only from one thread at any point of time (we have custom session pool).
> Broker URI is vm://jboss-activemq-broker?jms.copyMessageOnSend=false&jms.objectMessageSerializationDefered=true&jms.useAsyncSend=true
> The NPE occurs occasionally, we were not able to reproduce it deterministically so far.
> Any suggestions on how to investigate this?

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