一緒に創造し、成長するために一緒に働きましょう!「ナゲッツデイリー新プラン・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");
}
复制代码