RocketMQ(2)
1. 消费端集群消费(负载均衡)
示例代码:
- /**
- * Producer,发送消息
- *
- */
- public class Producer {
- public static void main(String[] args) throws MQClientException, InterruptedException {
- DefaultMQProducer producer = new DefaultMQProducer("message_producer");
- producer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
- producer.start();
- for (int i = 0; i < 100; i++) {
- try {
- Message msg = new Message("TopicTest",// topic
- "Tag1",// tag
- ("Hello RocketMQ " + i).getBytes()// body
- );
- SendResult sendResult = producer.send(msg);
- System.out.println(sendResult);
- }
- catch (Exception e) {
- e.printStackTrace();
- Thread.sleep(1000);
- }
- }
- producer.shutdown();
- }
- }
- /**
- * Consumer,订阅消息
- */
- public class Consumer1 {
- public Consumer1() {
- try {
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
- consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
- consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
- consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
- consumer.registerMessageListener(new Listener());
- consumer.start();
- } catch (MQClientException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- class Listener implements MessageListenerConcurrently {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- try {
- for (MessageExt msg : msgs) {
- String topic = msg.getTopic();
- String msgBody = new String(msg.getBody(), "utf-8");
- String tags = msg.getTags();
- System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
- System.out.println("======暂停=====");
- Thread.sleep(60000);
- }
- } catch (Exception e) {
- e.printStackTrace();
- return ConsumeConcurrentlyStatus.RECONSUME_LATER;
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- }
- public static void main(String[] args) throws InterruptedException, MQClientException {
- Consumer1 consumer1 = new Consumer1();
- System.out.println("Consumer1 Started.");
- }
- }
- /**
- * Consumer,订阅消息
- */
- public class Consumer2 {
- public Consumer2() {
- try {
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
- consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
- consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
- consumer.registerMessageListener(new Listener());
- consumer.start();
- } catch (MQClientException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- class Listener implements MessageListenerConcurrently {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- try {
- for (MessageExt msg : msgs) {
- String topic = msg.getTopic();
- String msgBody = new String(msg.getBody(), "utf-8");
- String tags = msg.getTags();
- System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
- }
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- return ConsumeConcurrentlyStatus.RECONSUME_LATER;
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- }
- public static void main(String[] args) throws InterruptedException, MQClientException {
- Consumer2 consumer2 = new Consumer2();
- System.out.println("Consumer2 Started.");
- }
- }
一个生产者,两个消费者,注意两个消费者的组名要一样。
先启动两个消费者(customer1,customer2),通过控制台查看如下:
再启动生产者生成100条消息,消费情况如下:
生成的100条消息被customer1和customer2平均的消费了。可以通过consumer.setAllocateMessageQueueStrategy去设置分配策略。
BTW:这是默认的模式,可以通过consumer.setMessageModel设置,MessageModel.CLUSTERING | MessageModel.BROADCASTING,如果是广播消费,则每个客户端都会收到生产端的所有消息
2.消息未响应会重发
代码示例:
- public class Producer {
- public static void main(String[] args) throws MQClientException, InterruptedException {
- DefaultMQProducer producer = new DefaultMQProducer("message_producer");
- producer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
- producer.start();
- for (int i = 0; i < 1; i++) {
- try {
- Message msg = new Message("TopicTest",// topic
- "Tag1",// tag
- ("Hello RocketMQ " + i).getBytes()// body
- );
- SendResult sendResult = producer.send(msg);
- System.out.println(sendResult);
- }
- catch (Exception e) {
- e.printStackTrace();
- Thread.sleep(1000);
- }
- }
- producer.shutdown();
- }
- }
- public class Consumer1 {
- public Consumer1() {
- try {
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
- consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
- consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
- consumer.registerMessageListener(new Listener());
- consumer.start();
- } catch (MQClientException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- class Listener implements MessageListenerConcurrently {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- try {
- for (MessageExt msg : msgs) {
- String topic = msg.getTopic();
- String msgBody = new String(msg.getBody(), "utf-8");
- String tags = msg.getTags();
- System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
- System.out.println("======暂停=====");
- Thread.sleep(600000);
- }
- } catch (Exception e) {
- e.printStackTrace();
- return ConsumeConcurrentlyStatus.RECONSUME_LATER;
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- }
- public static void main(String[] args) throws InterruptedException, MQClientException {
- Consumer1 consumer1 = new Consumer1();
- System.out.println("Consumer1 Started.");
- }
- }
- public class Consumer2 {
- public Consumer2() {
- try {
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
- consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
- consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
- consumer.registerMessageListener(new Listener());
- consumer.start();
- } catch (MQClientException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- class Listener implements MessageListenerConcurrently {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- try {
- for (MessageExt msg : msgs) {
- String topic = msg.getTopic();
- String msgBody = new String(msg.getBody(), "utf-8");
- String tags = msg.getTags();
- System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
- }
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- return ConsumeConcurrentlyStatus.RECONSUME_LATER;
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- }
- public static void main(String[] args) throws InterruptedException, MQClientException {
- Consumer2 consumer2 = new Consumer2();
- System.out.println("Consumer2 Started.");
- }
- }
先启动consumer1,再启动consumer2,最后启动producer
consumer1收到了消息,consumer2没有收到消息,这时把consumer1强制停止,也就是说consumer1不会给MQ返回响应,查看结果:
consumer2也收到消息了,说明在MQ没收到消费端响应的情况下,会重发消息。
3. 修改topic的队列数
默认的队列数是4个,可以从执行结果中看出:queueId都是0-3
细节可以看https://www.cnblogs.com/dyfh/p/4113677.html
可以增加设置producer.createTopic("TopicTest", "TopicTest", 8);
RocketMQ(2)的更多相关文章
- RocketMQ原理解析-Remoting
Remoting2. 通信层底层传输协议 RocketMq服务器与客户端通过传递RemotingCommand来交互,通过NettyDecoder,对RemotingCommand进行协议的编码与解码 ...
- RocketMQ原理解析-Broker
broker 1. broker的启动 brker的启动 Broker向namesrv注册 1. 获取namesrv的地址列表(是乱序的) 2. 遍历向每个namesrv注册topic的配置信息top ...
- RocketMQ原理解析-Consumer
consumer 1.启动 有别于其他消息中间件由broker做负载均衡并主动向consumer投递消息,RocketMq是基于拉模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消 ...
- RocketMQ原理解析-Producer
producer producer 1.启动流程 Producer如何感知要发送消息的broker即brokerAddrTable中的值是怎么获得的, 1. 发送消息的时候指定会指定topic,如果 ...
- 分布式开放消息系统(RocketMQ)的原理与实践
分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一 ...
- rocketmq生产者和消费者
1.生产者: package com.ebways.mq.test.mq; import com.alibaba.rocketmq.client.exception.MQClientException ...
- rocketmq查看命令
首先进入 RocketMQ 工程,进入/RocketMQ/bin 在该目录下有个 mqadmin 脚本 . 查看帮助: 在 mqadmin 下可以查看有哪些命令 a: 查看具体命令的使 ...
- rocketmq生产者部署的机器注意事项
报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'warningP ...
- Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件
引言 上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至 ...
- Kafka vs RocketMQ—— Topic数量对单机性能的影响-转自阿里中间件
引言 上一期我们对比了三类消息产品(Kafka.RabbitMQ.RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务 ...
随机推荐
- <MySQL>入门四 事务控制语言 TCL
-- TCL /* Transcation Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行 案例:转账 name ...
- Java基础学习总结(78)——Java main方法深入研究学习
1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7开始就行不通了. 2.main() ...
- Leetcode 123.买卖股票的最佳时机III
买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你 ...
- Android NumberProgressBar:动态移动显示百分比进度的进度条
Android NumberProgressBar:动态移动显示百分比进度的进度条 NumberProgressBar是github上一个开源项目,其项目主页是:https://github.c ...
- image url to base64
image url to base64 https://www.base64-image.de/ https://www.browserling.com/tools/image-to-base64 h ...
- 【Java基础】Java基本数据类型与位运算
1.赋值运算符 赋值使用操作符“=”.它的意思是“取右边的值(即右值),把它复制给左边(即左值)”.右值可以是任何 常数.变量或者表达式 (只要它能 生成 一个值就行).但左值必须是一个明确的,已命名 ...
- java数组知识总结(一)//按类
在线api 目录: 零/数组(基本元素) 1. 声明一个数组 2. 创建一个数组 3. 数组名.length 4. 数组的引用 一/java.lang.reflect.Array / ...
- 通过JQUERY获取SELECT OPTION中选中的值
遇到一样学一样. 一个是取KEY,一个是取VALUE,一个是取所有文本. var dbuser_select = $("#dbuser_select option:selected" ...
- Ubuntu 16.04常用快捷键(转)
注意:在Linux下Win键就是Super键 启动器 Win(长按) 打开启动器,显示快捷键 Win + Tab 通过启动器切换应用程序 Win + 1到9 与点击启动器上的图标效果一样 Win + ...
- Memcached高可用方案收集(集群及分布式)
Memcached的集群方案有很多,不止magent一个,但是单靠集群软件去实现高可用感觉还是会缺少一步,最推荐的方案应该是软件加编码去实现高可用,至少能保证站点的99.5%的可运行行,以下是集群的方 ...