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

标签 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() 显式接收,并没有真正明确的定义。

另外我想问一下,如果receiveNoWait()没有可用的消息,是否会在broker中触发一些刷新消费者进程,那么接下来的receiveNoWait()会收到消息吗?

我提供的示例代码在 ActiveMQ 上运行,但我的问题更概念化而不是特定于提供者,因为我对其他 JMS 提供者有相同的观察。

最佳答案

不,规范不保证对 receiveNoWait 的任何调用都会返回一条消息,可能会,也可能不会。使用 receiveNoWait 时,您必须始终检查空返回值并采取相应措施。

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

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

简而言之,这完全取决于客户和代理人如何实现 receiveNoWait,但无论怎样,您始终需要考虑到您不会从该方法收到返回消息的可能性.

关于java - 当消息可用时,JMS receiveNoWait() 是否保证消息传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36626634/

相关文章:

php - 同时发出 SQL 语句

java - 如何使用spring boot在rabbit mq中创建动态队列?

java - 什么时候拥有 Hibernate 二级缓存的 CPU yield 超过初始命中

Java -JsonArray.contains(string) 没有这个函数?

jms - Apache Kafka 和 JMS 之间的连接

c++ - rabbitmq c++ 客户端未在 5672 端口连接到 rabbitmq-server

java - C# 中的参数化 System.Type 变量

java - 将类似 block 的序列解析为 Map<String, Type>

java - ems tibco 和发送消息的凭据

java - 如果我们有 Active MQ,为什么还需要 Mule?