[ 
https://issues.apache.org/jira/browse/ARTEMIS-4327?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Justin Bertram updated ARTEMIS-4327:
------------------------------------
    Description: 
*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: 
{code:java}
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);{code} 
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:
{noformat}
00 00 00 0b 00 0b 74 65 73 74 20 73 74 72 69 6e 67{noformat}

Looking at the Artemis client source code, particularly 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
{code:java}
   public String readNullableString() {
      int b = buffer.readByte();
      if (b == DataConstants.NULL) {
         return null;
    }

      return readStringInternal();
   }{code} 

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

  was:
*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: 
{code:java}
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);{code} 

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:
{noformat}
00 00 00 0b 00 0b 74 65 73 74 20 73 74 72 69 6e 67{noformat}

Looking at the Artemis client source code, particularly 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
{code:java}
   public String readNullableString() {
      int b = buffer.readByte();
      if (b == DataConstants.NULL) {
         return null;
    }

      return readStringInternal();
   }{code} 

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


>  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
>    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
>            Priority: Major
>
> *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: 
> {code:java}
> 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);{code} 
> 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:
> {noformat}
> 00 00 00 0b 00 0b 74 65 73 74 20 73 74 72 69 6e 67{noformat}
> Looking at the Artemis client source code, particularly 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
> {code:java}
>    public String readNullableString() {
>       int b = buffer.readByte();
>       if (b == DataConstants.NULL) {
>          return null;
>     }
>       return readStringInternal();
>    }{code} 
> 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