Chelsea Salyards created ARTEMIS-4327:
-----------------------------------------

             Summary:  AMQBuffer.readNullableString() is returning null when 
the buffer is not empty
                 Key: ARTEMIS-4327
                 URL: https://issues.apache.org/jira/browse/ARTEMIS-4327
             Project: ActiveMQ Artemis
          Issue Type: Bug
          Components: ActiveMQ-Artemis-Native
    Affects Versions: 2.19.1
         Environment: Artemis client is 
org.apache.activemq:artemis-core-client:2.19.1, Java code is using the Artemis 
Core API.

Artemis server appears to be 2.28.0, and is running in a Docker container.
            Reporter: Chelsea Salyards
            Assignee: Clebert Suconic


*The Issue*

Either I do not understand the intended functionality of 
AMQBuffer.readNullableString(), or it is not functioning correctly. Based on 
the name, I assumed that it would return null if the buffer was empty, and if 
it was not, it would return a string.

In my client code, I have the following:

 

ServerLocator locator = ActiveMQClient.createServerLocator(AMQ_BROKER_URL);

ClientSessionFactory sessionFactory = locator.createSessionFactory();

ClientSession session = sessionFactory.createSession();

session.start();

Client message = session.createMessage(true);

message.getBodyBuffer().writeString("test string");

logger.debug("Regular string: " + message.getDataBuffer().readString());

logger.debug("Nullable string: " + 
message.getDataBuffer().readNullableString());

ClientProducer producer = session.createProducer("test-queue");

producer.send(message);

 

The first debug output, using readString() prints out the string "test string" 
like I expect.

 

However, the second debug output prints null, but I expected it to print "test 
string".

 

*Potential Cause*

I took a look at the message in the queue via the Artemis web console, and I 
can see the bytes for the message body are as follows:

 

00 00 00 0b 00 0b 74 65 73 74 20 73 74 72 69 6e 67

 

I took a look at the Artemis client source code, and looking at the code for 
ChannelBufferWrapper, an implementation of the ActiveMQBuffer class, I see that 
readNullableString() is defined as the following:

 

activemq-artemis/artemis-commons/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ChannelBufferWrapper.java

   public String readNullableString() {
      int b = buffer.readByte();
      if (b == DataConstants.NULL) {
         return null;
      }
      return readStringInternal();
   }

 

So if I am reading this correctly, this seems to be saying that if the buffer 
starts with the byte 00, it will return null, even if the buffer is not empty. 
Am I reading this correctly? As shown in my example above, the message body 
starts with byte 00.

Other details about the message, if it helps:

durable: true

protocol: CORE

type: default



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to