Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMS receiveNoWait()是否保证在消息可用时传递消息?_Java_Jms_Rabbitmq_Activemq_Jboss Messaging - Fatal编程技术网

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

Java JMS receiveNoWait()是否保证在消息可用时传递消息?,java,jms,rabbitmq,activemq,jboss-messaging,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); Des

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

这是我的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();
这是我的receive()方法:

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();
我执行:

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()是否在代理中有消息时保证消息传递?已成功执行发送(),因此目标中至少有一条消息

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

我还想问,如果receiveNoWait()没有可用的消息,它是否应该在代理中触发一些刷新消费者进程,以便下一个receiveNoWait()将接收消息


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

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

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

其他实现确实会向代理发送轮询请求,例如,Qpid JMS使用AMQP链路耗尽请求请求请求代理向其发送任何可供分派的消息,代理将发送这些消息,或者发出信号表明链路耗尽,并且没有消息准备就绪


简言之,这完全取决于客户机和代理如何实现
receiveNoWait
,但无论您需要做什么,都要考虑到无法从该方法返回消息的可能性

谢谢你的回答,蒂姆。我的理解是一样的,但由于规范中缺乏适当的解释,我决定寻求更多的意见。仅供参考,有一个关于此标准的旧的未解决的错误报告。关于如何提出问题的好例子!