ActiveMQは同期的にメッセージの受信を待機します

メッセージを同期的に受信するMQコンシューマーをシミュレートする必要があります。

シーンは次のとおりです。APP1、APP2、APP3と呼ばれる2つのアプリがあります。

  1. APP1がAPP2にリクエストを送信し、次にAPP2がAPP3をリクエストします。計算はAPP3によって行われます。APP2は変更できませんが、APP3は変更できます
  2. APP1はAPP2の結果が同期的に戻るのを待つ必要があります。これはHTTPによってポーリングできますが、リソースを消費しすぎるため、MQについて考えてください。
  3. APP3は計算を完了し、MQメッセージを送信します
  4. APP1がMQメッセージを受信しました
  5. 次の操作に進む

APP1がAPP3メッセージの待機を同期する方法を実現するため。

環境

ActiveMQ:5.15.9
JDK:1.8

達成する

    @Test
    public void testMQ() throws Exception {
        log.info("开始...");
        final ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(
                "user", "password", "tcp://host:61616");
        final Connection connection = factory.createConnection();
        connection.start();
        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        log.info("Session 创建完");
        receiveFromQueue(session, "jimo-q1");

        // 第二个queue
        receiveFromQueue(session, "jimo-q2");

        log.info("结束");
        connection.close();
    }

    private void receiveFromQueue(Session session, String queueName) throws JMSException {
        final Queue queue = session.createQueue(queueName);
        final MessageConsumer consumer = session.createConsumer(queue);
        /*consumer.setMessageListener((m) -> {
            try {
                System.out.println(((TextMessage) m).getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        });*/
        // 同步等待一条消息,最多等待10分钟
        final Message msg = consumer.receive(10 * 60 * 1000L);
        System.out.println(queueName + ":" + ((TextMessage) msg).getText());
    }

確認する

activemqコマンドラインで本番メッセージコマンドを実行します。

./activemq producer --user user --password password --destination queue://jimo-q1 --brokerUrl tcp://host:61616 --messageCount 1
./activemq producer --user user --password password --destination queue://jimo-q2 --brokerUrl tcp://host:61616 --messageCount 1

ログ出力を見ることができます

2020 三月 03 09:06:42,731 [main] [INFO] [ServiceTest]: ServiceTest.testMQ( ServiceTest.java:48) - 开始...
2020 三月 03 09:06:43,157 [main] [INFO] [ServiceTest]: ServiceTest.testMQ( ServiceTest.java:54) - Session 创建完
jimo-q1:test message: 0
jimo-q2:test message: 0
2020 三月 03 09:06:55,865 [main] [INFO] [ServiceTest]: ServiceTest.testMQ( ServiceTest.java:60) - 结束
元の記事を80件公開しました 319のようです 訪問数340,000以上

おすすめ

転載: blog.csdn.net/jimo_lonely/article/details/104929573