RocketMQ 通常メッセージの戦闘訓練

一緒に創造し、成長するために一緒に働きましょう!「ナゲッツデイリー新プラン・8月アップデートチャレンジ」参加23日目、イベント詳細はこちら

以前に RocketMQ のソース コードを学習したことがあり、CV の将来の使用に便利な、さまざまなメッセージの送信と消費のデモの例を次に示します。

関連する構成、インストール、および起動については、この記事juejin.cn/post/712688…で説明されています。

通常のメッセージは同期的に送信されます

同期メッセージとは、メッセージが送信された後、同期的に待機し、 Broker から正常な応答を受信するまで次のメッセージの送信を続行しないことを意味します。このメソッドは、メッセージが Broker に正常に送信されることを保証でき、重要な通知など、一部の重要なメッセージはこのメソッドを使用できます。

public static void main(String[] args) throws Exception {
    //实例化消息生产者对象
    DefaultMQProducer producer = new DefaultMQProducer("group_luke");
    //设置NameSever地址
    producer.setNamesrvAddr("127.0.0.1:9876");
    //启动Producer实例
    producer.start();
    for (int i = 0; i < 10; i++) {
        Message msg = new Message("topic_luke", "tag", ("这是第"+i+"条消息。").getBytes(StandardCharsets.UTF_8));

        //同步发送方式
        SendResult send = producer.send(msg);
        //确认返回
        System.out.println(send);
    }
    //关闭producer
    producer.shutdown();
}
复制代码

通常メッセージの非同期送信

非同期メッセージの送信者は、メッセージを送信した後、受信者からの応答を待たずに 2 番目のメッセージを送信します。送信者は、コールバック インターフェイスを介してサーバーの応答を受信し、応答結果を処理します。

public static void main(String[] args) throws Exception {
    //实例化消息生产者对象
    DefaultMQProducer producer = new DefaultMQProducer("group_luke");
    //设置NameSever地址
    producer.setNamesrvAddr("127.0.0.1:9876");
    //启动Producer实例
    producer.start();
    for (int i = 0; i < 10; i++) {
        Message msg = new Message("topic_luke", "tag", ("这是第"+i+"条消息。").getBytes(StandardCharsets.UTF_8));
        //SendCallback会接收异步返回结果的回调
        producer.send(msg, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println(sendResult);
            }
            @Override
            public void onException(Throwable throwable) {
                throwable.printStackTrace();
            }
        });
    }
    //若是过早关闭producer,会抛出The producer service state not OK, SHUTDOWN_ALREADY的错
    Thread.sleep(10000);
    //关闭producer
    producer.shutdown();
}
复制代码

通常メッセージの一方向送信

単品送信は送信結果は気にせず、レスポンスを待たずにリクエストを送るだけです。メッセージの送信にはほとんど時間がかかりません。

public static void main(String[] args) throws Exception {
    //实例化消息生产者对象
    DefaultMQProducer producer = new DefaultMQProducer("group_luke");
    //设置NameSever地址
    producer.setNamesrvAddr("127.0.0.1:9876");
    //启动Producer实例
    producer.start();
    for (int i = 0; i < 10; i++) {
        Message msg = new Message("topic_luke", "tag", ("这是第"+i+"条消息。").getBytes(StandardCharsets.UTF_8));

        //同步发送方式
        producer.sendOneway(msg);
    }
    //关闭producer
    producer.shutdown();
}
复制代码

クラスター消費モード

コンシューマーは、負荷分散の方法でメッセージを消費します。同じグループの複数のコンシューマーがキュー内のメッセージをまとめて消費し、各コンシューマーは異なるメッセージを処理します。コンシューマ グループ内の各コンシューマ インスタンスは、メッセージを一緒に消費します。つまり、メッセージは、グループの下の 1 つのインスタンスにのみ配信され、一度だけ消費されます。

たとえば、トピックに 3 つのキューがあり、1 つのコンシューマー グループに 3 つのインスタンスがある場合、各インスタンスは 1 つのキューのみを消費します。クラスター消費モードは、コンシューマーのデフォルトの消費モードです。

public static void main(String[] args) throws Exception {
    //实例化消息消费者
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group_luke");
    //指定nameserver地址
    consumer.setNamesrvAddr("127.0.0.1:9876");
    //订阅topic,"*"表示所有tag
    consumer.subscribe("topic_luke","*");

    consumer.setMessageModel(MessageModel.CLUSTERING);
    // 注册回调实现类来处理从broker拉取回来的消息
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @SneakyThrows
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            for (MessageExt msg : msgs) {
                System.out.println(new String(msg.getBody()));
            }
            // 标记该消息已经被成功消费
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    });
    // 启动消费者实例
    consumer.start();
    System.out.printf("Consumer Started.%n");
}
复制代码

放送消費モデル

ブロードキャスト消費モードでは、メッセージは Group の下の各 Consumer インスタンスに配信されます。つまり、メッセージはグループ内の各コンシューマによって 1 回消費されます。実際、コンシューマ グループの下の各コンシューマ インスタンスは、トピックの下の各メッセージ キューを取得して、消費をプルおよびキャンセルします。したがって、メッセージは各コンシューマ インスタンスに配信されます。

public static void main(String[] args) throws Exception {
    //实例化消息消费者
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group_luke");
    //指定nameserver地址
    consumer.setNamesrvAddr("127.0.0.1:9876");
    //订阅topic,"*"表示所有tag
    consumer.subscribe("topic_luke","*");

    consumer.setMessageModel(MessageModel.BROADCASTING);
    // 注册回调实现类来处理从broker拉取回来的消息
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @SneakyThrows
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            for (MessageExt msg : msgs) {
                System.out.println(new String(msg.getBody()));
            }
            // 标记该消息已经被成功消费
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    });
    // 启动消费者实例
    consumer.start();
    System.out.printf("Consumer Started.%n");
}
复制代码

おすすめ

転載: juejin.im/post/7134336877431586830