1

testという名前のキューにメッセージを送信するメッセージプロデューサーを実装するJavaクラスがあります。同じキューからメッセージを取得するクライアントとして機能する別のクラスがあります。メッセージがクライアント側で受信されたかどうかを知る方法について混乱しています。私はどこかで使うべきだと読んだ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();

    }
}

助けていただければ幸いです。

4

1 に答える 1

3

受信確認を使用して、メッセージが受信されたかどうかを確認することはできません。

実際、メッセージング全般、特に JMS は、メッセージがクライアントに到達したかどうかを送信アプリケーションが知る必要がないように設計されています。このコンセプトは、保証付き配送として知られています。

謝辞はその一部です。キューのメッセージを読み取って確認応答しない場合、JMS ブローカは後でメッセージの再配信を試みます。コミットまたはロールバックできるトランザクションを使用して、概念を別のレベルに引き上げることができます。

メッセージの元の送信者への領収書がどうしても必要な場合は、返信メッセージを送信することをお勧めします。JMS には、相関 ID と ReplyTo フィールドを使用した要求/応答のスキーマがあります。多くの例をグーグルで検索できますが、EIPの例を次に示します。

于 2013-03-07T08:15:46.263 に答える