簡體   English   中英

確認客戶收到生產者消息

[英]Acknowledge receipt of producer message by client

我有一個實現消息生成器的Java類,它將消息發送到名為test的隊列。 我有另一個類作為客戶端,它從同一隊列中獲取消息。 我很困惑如何知道客戶端是否收到了該消息。 我在某處讀到了我應該使用message.acknowledge() ,但我不知道這樣做的正確方法。 我的代碼如下所示:

制片人:

public class Producer {
    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;

    private static String subject = "que";

    public static void main(String[] args) throws JMSException,
            InterruptedException {

        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();

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

        Destination destination = session.createQueue(subject);

        MessageProducer producer = session.createProducer(destination);

        // 
        int i = 0;
        //while(true)
        // {
        TextMessage message = session
                .createTextMessage("this is a gfjfjf " + i);
        Thread.sleep(2000);
        // 
        producer.send(message);
        i++;
        System.out.println("Sent message '" + message.getText() + "'");
        System.out.println(ActiveMQConnection.DEFAULT_BROKER_URL);
        MessageListener ML = session.getMessageListener();
        System.out.println(ML);
        connection.close();
    }
}

消費者:

public class Consumer {

    private static String url = "failover://tcp://192.168.1.17:61616";

    private static String subject = "que";

    public static void main(String[] args) throws JMSException {
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();

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

        Destination destination = session.createQueue(subject);

        MessageConsumer consumer = session.createConsumer(destination);

        // while(true)
        //  {
        Message message = consumer.receive();

        System.out.println(message);

        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            System.out.println("Received message '" + textMessage.getText()
                    + "'");
        }
        if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) {
            System.out.println(session.getAcknowledgeMode());
            System.out.println(Session.CLIENT_ACKNOWLEDGE);
            message.acknowledge();
        }
        System.out.println(session.getAcknowledgeMode());
        System.out.println(Session.CLIENT_ACKNOWLEDGE);
        message.acknowledge();

    }
}

任何幫助贊賞。

您無法使用確認來檢查是否已收到消息。

實際上,通常設置消息傳遞,特別是設計JMS,以便發送應用程序不需要知道消息是否已到達客戶端。 這個概念被稱為保證交付。

致謝是其中的一部分。 如果您讀取隊列的消息但未確認,則JMS代理將嘗試在以后重新發送消息。 您可以使用可以提交或回滾的事務將概念提升到另一個級別。

如果您確實需要收到郵件的原始發件人,我建議您發送郵件回復。 JMS具有使用相關ID和ReplyTo字段的請求/回復的原理圖。 你可以上傳很多例子,但這里有一個EIP

暫無
暫無

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

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