RocketMQ-广播模式消费
Rocketmq 消费者默认是集群的方式消费的,消费者还可以用广播的模式进行消费。广播模式消费就是所有订阅同一个主题的消费者都会收到消息。代码实现上其实很简单,就是在消费端添加
- consumer.setMessageModel(MessageModel.BROADCASTING);
就可以了。我们看实验步骤:
一、启动ConsumerBroadCastMember1
二、启动ConsumerBroadCastMember2
三、运行ProducerBraodCast
四、我们可以看到两个Consumer都收到了同样的消息。
Producer端:
- package org.hope.lee.producer;
- import com.alibaba.rocketmq.client.exception.MQBrokerException;
- import com.alibaba.rocketmq.client.exception.MQClientException;
- import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
- import com.alibaba.rocketmq.client.producer.SendCallback;
- import com.alibaba.rocketmq.client.producer.SendResult;
- import com.alibaba.rocketmq.common.message.Message;
- import com.alibaba.rocketmq.common.message.MessageQueue;
- import com.alibaba.rocketmq.remoting.exception.RemotingException;
- public class ProducerBroadCast {
- public static void main(String[] args) {
- DefaultMQProducer producer = new DefaultMQProducer("push_consumer");
- producer.setNamesrvAddr("192.168.31.176:9876;192.168.31.165:9876");
- try {
- // 设置实例名称
- producer.setInstanceName("producer_broadcast");
- // 设置重试次数
- producer.setRetryTimesWhenSendFailed(3);
- // 开启生产者
- producer.start();
- // 创建一条消息
- Message msg = new Message("topic_broadcast", "TagA", "OrderID0034", "message_broadcast_test".getBytes());
- SendResult send = producer.send(msg);
- System.out.println("id:--->" + send.getMsgId() + ",result:--->" + send.getSendStatus());
- } catch (MQClientException e) {
- e.printStackTrace();
- } catch (RemotingException e) {
- e.printStackTrace();
- } catch (MQBrokerException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- producer.shutdown();
- }
- }
Consumer端:
- package org.hope.lee.consumer;
- import java.util.List;
- import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import com.alibaba.rocketmq.client.exception.MQClientException;
- import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
- import com.alibaba.rocketmq.common.message.MessageExt;
- import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel;
- public class ConsumerBroadCastMember1 {
- public static void main(String[] args) throws MQClientException {
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_broadcast");
- consumer.setNamesrvAddr("192.168.31.176:9876;192.168.31.165:9876");
- // 批量消费,每次拉取10条
- consumer.setConsumeMessageBatchMaxSize(10);
- //设置广播消费
- consumer.setMessageModel(MessageModel.BROADCASTING);
- //设置集群消费
- // consumer.setMessageModel(MessageModel.CLUSTERING);
- // 如果非第一次启动,那么按照上次消费的位置继续消费
- consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
- // 订阅PushTopic下Tag为push的消息
- consumer.subscribe("topic_broadcast", "TagA || Tag B || Tage C");
- consumer.registerMessageListener(new MqBroadCastListener());
- consumer.start();
- System.out.println("Consumer1 Started.");
- }
- }
- class MqBroadCastListener implements MessageListenerConcurrently{
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- try {
- MessageExt msg = msgs.get(0);
- String msgBody = new String(msg.getBody(), "utf-8");
- System.out.println("msgBody:" + msgBody);
- } catch(Exception e) {
- e.printStackTrace();
- return ConsumeConcurrentlyStatus.RECONSUME_LATER;
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- }
- package org.hope.lee.consumer;
- import java.util.List;
- import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import com.alibaba.rocketmq.client.exception.MQClientException;
- import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
- import com.alibaba.rocketmq.common.message.MessageExt;
- import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel;
- public class ConsumerBroadCastMember2 {
- public static void main(String[] args) throws MQClientException {
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_broadcast");
- consumer.setNamesrvAddr("192.168.31.176:9876;192.168.31.165:9876");
- // 批量消费,每次拉取10条
- consumer.setConsumeMessageBatchMaxSize(10);
- //设置广播消费
- consumer.setMessageModel(MessageModel.BROADCASTING);
- //设置集群消费
- // consumer.setMessageModel(MessageModel.CLUSTERING);
- // 如果非第一次启动,那么按照上次消费的位置继续消费
- consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
- // 订阅PushTopic下Tag为push的消息
- consumer.subscribe("topic_broadcast", "TagA || Tag B || Tage C");
- consumer.registerMessageListener(new MqBroadCastListener());
- consumer.start();
- System.out.println("Consumer2 Started.");
- }
- }
结果:
https://gitee.com/huayicompany/RocketMQ-learn/tree/master/rocketmq-api
RocketMQ-广播模式消费的更多相关文章
- rocketmq广播消息
发布与模式实现.广播就是向一个主题的所有订阅者发送同一条消息. 在发送消息的时候和普通的消息并与不同之处,只是在消费端做一些配置即可. Consumer消息消费 public class Broadc ...
- Python Rabbit 广播模式
Exchange 在RabbitMQ下进行广播模式需要用到,exchange这个参数,它会把发送的消息推送到queues队列中,exchange必须要知道,它接下来收到的消息要分给谁,是要发给一个qu ...
- Exchange-fanout 广播模式
一.前言 我们看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生.实际的情况是,生产者将消息发送到Exchange(交换器,下图中的X),由Exchange将消息路 ...
- RabbitMQ基本用法、消息分发模式、消息持久化、广播模式
RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...
- RabbitMQ广播模式
广播模式:1对多,produce发送一则消息多个consumer同时收到.注意:广播是实时的,produce只负责发出去,不会管对端是否收到,若发送的时刻没有对端接收,那消息就没了,因此在广播模式下设 ...
- RocketMQ集群消费的那些事
说明 RocketMQ集群消费的时候,我们经常看到类似注释里面 (1,(2 的写法,已经有时候有同学没注意抛异常的情况就是(3 模拟的情况.那么这3种情况到底是怎么样的呢?你是否都了然于心呢?下面我们 ...
- RocketMQ的顺序消费和事务消费
一.三种消费 :1.普通消费 2. 顺序消费 3.事务消费 1.1 顺序消费:在网购的时候,我们需要下单,那么下单需要假如有三个顺序,第一.创建订单 ,第二:订单付款,第三:订单完成.也就是这个三个 ...
- demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理
//durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在 //topic 根据不同的routkey 发送和接收信息 //fanout 广播模 ...
- rabbitmq 交换机模式一 广播模式 fanout
<?php require_once "./vendor/autoload.php"; use PhpAmqpLib\Connection\AMQPStreamConnect ...
随机推荐
- PHP正在进行时-变量
在PHP中,变量是$+变量名,变量名遵循标识符的命名规则,可以以字母.下划线开头,可以由数字.下划线.字母组成合法的变量名. 变量声明 所有变量在使用之前应该进行声明,而且最好带上注释,虽然在PHP中 ...
- 【倍增】洛谷P3379 倍增求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 【Tarjan缩点】PO3352 Road Construction
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12532 Accepted: 630 ...
- (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- Windows下安装Selenium
安装python,建议在官网下载python3以上的版本 安装easy_install,找度娘 安装selenium,在命令行窗口下输入:pip install -U selenium 下载chrom ...
- python 版本管理工具 pyenv 使用备忘
安装步骤 安装 xcode-select 以及 homebrew(前者在安装 git 的时候装过,后者 mac 开发必备无需解释) 安装 pyenv brew install pyenv,用 pyen ...
- Inno Setup 自定义界面心得
因为项目需要,需要打 windows 安装包,要求安装界面完全按照需求来.作为没接触过这块儿的服务端宝宝,在此期间踩了很多坑. 坑不提也罢,最终结果圆满,记录下与大部分网上PO出来的做法不太一样的小心 ...
- django命令(笔记,自己看的)
新建一个项目,名字为mysite:django-admin.py startproject mysite 新建一个应用App,名字为apppython manage.py startapp learn ...
- CSS3中only-child伪类选择器
<body> <style type="text/css"> //只对li1设置样式 li:nth-child(1):nth-last-child(1){ ...
- android企业级商城源码、360°全景图VR源码、全民直播源码等
Android精选源码 [新版]Android技术博客精华汇总 开源了:乐乐音乐5.0-Android音乐播放器 android实现仿真水波纹效果源码 360°全景图VR,这是一个值得把玩的APP a ...