3

您好,我正在编写某种简单的测试场景,在其中执行以下源代码:

这是我的 send() 方法:

public void send() throws JMSException {

    Session session = null;
    MessageProducer producer = null;

    try {
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        Destination destination = session.createQueue("TEST.FOO");

        producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        byte[] uselessData = new byte[1024];

        BytesMessage message = session.createBytesMessage();
        message.writeBytes(uselessData);

        producer.send(message);

    } finally {
        producer.close();
        session.close();
    }
}

这是我的接收()方法:

public void receive() throws JMSException {

    Session session = null;
    MessageConsumer consumer = null;

    try {
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("TEST.FOO");
        consumer = session.createConsumer(destination);

        Message hugeMessage = consumer.receiveNoWait();

        if (hugeMessage == null) {
            System.out.println("Message was not received");
            unsucsesfullCount++;
        } else {
            if (hugeMessage instanceof BytesMessage) {
                System.out.println("Message received");
            }
        }
    } finally {
        consumer.close();
        session.close();
    }

}

我执行:

send();
receive();

receiveNoWait()之后的消息值始终为null

我的问题是当代理中有消息时,receiveNoWait()是否保证消息传递?send()已成功执行,因此目标中至少有一条消息。

我已经在规范中进行了搜索,但是如果在代理端可用的消息应该由客户端的receiveNoWait()显式接收,并没有真正明确的定义。

另外我想问一下,如果receiveNoWait()没有可用的消息,是否应该触发broker 中的一些刷新消费者进程,所以下一个receiveNoWait()会收到消息?

我提供的示例代码在 ActiveMQ 上运行,但我的问题比提供程序更具体,因为我对其他 JMS 提供程序有相同的观察。

4

1 回答 1

4

不,规范不保证任何调用receiveNoWait都会返回一条消息,它可能会,然后又可能不会。使用时,receiveNoWait您必须始终检查 null 返回并采取相应措施。

在 ActiveMQ 的情况下,如果代理已经向客户端发送了一条消息,客户端将返回一条消息,并且它在消费者预取缓冲区中立即可用,否则它只返回 null。

其他实现确实向代理发送轮询请求,例如 Qpid JMS 使用 AMQP 链接耗尽请求来要求代理向其发送任何可用于调度的消息,并且代理将发送它们或发出链接已耗尽的信号并且没有消息准备好。

简而言之,这完全取决于客户和经纪人他们如何实施receiveNoWait,但无论如何您总是需要考虑您不会从该方法返回给您的消息的机会。

于 2016-04-14T22:10:18.197 回答