当消息可用时,JMS receiveNoWait()是否保证消息传递?

时间:2016-04-14 14:46:57

标签: java jms rabbitmq activemq jboss-messaging

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

这是我的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();
    }
}

这是我的receive()方法:

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()明确接收到代理方可用的消息,则没有明确的定义。< / p>

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

我提供的示例代码在ActiveMQ上运行,但我的问题比提供者特定更具概念性,因为我对其他JMS提供者有相同的观察结果。

1 个答案:

答案 0 :(得分:4)

不,规范不保证对command! -nargs=+ Silent \ | execute ':silent !' .<q-args> \ | execute ':redraw!' 的任何调用都会返回消息,它可能会再次发送消息。使用:Silent ./myshell.sh > output时,您必须始终检查空返回并采取相应措施。

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

其他实现我确实向代理发送了轮询请求,例如Qpid JMS使用AMQP链接排放请求来询问代理发送任何可用于分派的消息,并且代理将发送它们或发信号通知链接耗尽,没有准备好的消息。

简而言之,它完全取决于客户和经纪人如何实施receiveNoWait,但无论你总是需要考虑到你没有得到回复给你的信息的机会从那个方法。