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

Jiri Daněk commented on QPIDJMS-325:
------------------------------------

I've done brief search on GitHub and from the code there, having looked at 
about 8 pages of results, it appears usual usage pattern is

{code}
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
{code}

and in one case I saw

{code}
// 
https://github.com/jianbinjiang/activemq/blob/0209d1d2b149988f933b7b50ae61322c7c84dc28/src/main/java/com/hk/demo/activemq/consumer/ConsumerService.java
while ((len = bm.readBytes(b)) != -1) {
    System.out.println(new String(b, 0, len));
}
{code}

The return value would make a difference in the second case. When receiving 
empty array, it would either print empty line, or nothing, depending on return 
value.

If I could choose, I'd make the return value to be 0 on EOF for the first read 
and all subsequent ones for BytesMessage... Sadly, that is something the 
Javadoc does not allow, and I don't have preference between the ActiveMQ 
behavior and (qpid-jms + ActiveMQ Artemis) behavior.

https://github.com/search?utf8=%E2%9C%93&q=BytesMessage+readBytes+language%3AJava+path%3A%2Fsrc%2Fmain%2Fjava&type=Code&ref=advsearch&l=Java&l=

I realize GitHub is not good corpus for this, because most of relevant JMS 
client code is probably not there.

> 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: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to