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

Robbie Gemmell commented on QPIDJMS-325:
----------------------------------------

The first pattern is how I would often expect it to be used, excepting 
potentially very large content, since BytesMessage does not dictate that you 
must read it repeatedly like StreamMessage does, theres only one chunk of data, 
and it has a method to give you the length of the content whereas StreamMessage 
does not, so you need to demarcate things with StreamMessage.

The BytesMessage javadoc overview notes thats its methods are largely based on 
DataInputStream and DataOutputStream. The readBytes of DataInputStream returns 
-1 immediately, which is where we get it from. From looking, but not trying, 
the JMS reference implementation (which makes even more direct use of 
DataInputStream than we do) and ActiveMQ Artemis clients (which I now realise 
you just mentioned also :P) seem like they would behave the same way Qpid JMS 
currently does.

> reading from empty buffer of a BytesMessage should return 0, not -1
> -------------------------------------------------------------------
>
>                 Key: QPIDJMS-325
>                 URL: https://issues.apache.org/jira/browse/QPIDJMS-325
>             Project: Qpid JMS
>          Issue Type: Bug
>          Components: qpid-jms-client
>    Affects Versions: 0.25.0
>            Reporter: Jiri Daněk
>            Priority: Trivial
>
> Consider the following test. According to 
> http://docs.oracle.com/javaee/7/api/javax/jms/BytesMessage.html#readBytes-byte:A-
>  the #readBytes method should return 0 when it is first called, as the number 
> of bytes in the buffer is 0 and it read 0 bytes. Only on subsequent calls it 
> should return -1. What happens now is that the method returns -1 the first 
> time.
> See the commented lines to try the same thing with ActiveMQ JMS Client 
> library, and with StreamMessage instead of BytesMessage. The behavior there 
> should be the same.
> ActiveMQ passes the test with BytesMessage and fails it with StreamMessage. 
> Qpid JMS fails with BytesMessage and passes with StreamMessage.
> {code}
> import org.apache.activemq.ActiveMQConnectionFactory;
> import org.apache.qpid.jms.JmsConnectionFactory;
> import org.junit.Test;
> import javax.jms.*;
> import static com.google.common.truth.Truth.assertThat;
> public class EmptyBufferInputTest {
>     @Test
>     public void testEmptyBufferInput() throws JMSException {
> //        ConnectionFactory connectionFactory = new 
> ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
>         JmsConnectionFactory connectionFactory = new 
> JmsConnectionFactory("amqp://127.0.0.1:5672");
>         Connection connection = connectionFactory.createConnection();
>         Session session = connection.createSession(false, 
> Session.AUTO_ACKNOWLEDGE);
>         final byte[] BYTE_LIST = {1, 2, 4};
> //        StreamMessage message = session.createStreamMessage();
>         BytesMessage message = session.createBytesMessage();
>         message.clearBody();
>         byte[] readList = new byte[BYTE_LIST.length - 1];
>         byte[] emptyList = {};
>         message.writeBytes(emptyList);
>         message.reset();
>         final int IS_EMPTY = 0;
>         assertThat(message.readBytes(readList)).isEqualTo(IS_EMPTY);
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to