簡體   English   中英

當消息可用時,JMS receiveNoWait()是否保證消息傳遞?

[英]Does JMS receiveNoWait() guarantee message delivery when messages are available?

您好,我正在編寫某種簡單的測試方案,在其中執行以下源代碼:

這是我的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()沒有可用的消息,它是否應該觸發代理中的一些刷新使用者進程,所以下一個receiveNoWait()將接收消息?

我提供的示例代碼在ActiveMQ上運行,但是我的問題比特定於提供程序的問題更具概念性,因為我對其他JMS提供程序也有相同的看法。

不,該規范不能保證對receiveNoWait任何調用receiveNoWait將返回一條消息,它可能會,然后可能不會。 使用receiveNoWait您必須始終檢查是否為空,並采取相應措施。

對於ActiveMQ,如果代理已向其分派了一條消息,則客戶端將返回一條消息,並且該消息可立即在使用者預取緩沖區中使用,否則它將返回null。

其他實現確實會向代理發送輪詢請求,例如Qpid JMS使用AMQP鏈接耗盡請求來要求代理向它發送任何可用於調度的消息,並且代理會發送它們或發出信號表明鏈接已耗盡並且沒有消息准備好。

簡而言之,這完全取決於客戶端和代理如何實現receiveNoWait但是無論您始終需要考慮什么原因,您都不會從該方法返回消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM