http://rocketmq.apache.org/docs/quick-start/

解压后添加启动脚本

  1. nohup sh bin/mqnamesrv >> logs/namesrv.log >& &
  1. nohup sh bin/mqbroker -n localhost: >> logs/broker.log >& &

启动broker的时候可能会报错

修改bin/runbroker.sh里面的JVM配置

  1. JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"

关闭

  1. sh bin/mqshutdown broker
  2. sh bin/mqshutdown namesrv

关于拒绝连接异常

  1. Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.0.1:> failed

解决方案:https://my.oschina.net/simpleton/blog/3022576

监控界面:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console

参考文章:https://www.cnblogs.com/cac2020/p/9447938.html

按文中部署后运行程序还报错:

直接在/etc/hosts中添加

127.0.0.1 dev-server02

再次运行即可

集群部署

使用2台机器,用2m-noslave 模式

2台机器IP为:

172.20.102.194 mq2

172.20.102.150 mq1

在两台机器的/etc/hosts中添加上面的配置

在mq1机器上配置

conf/2m-noslave/broker-a.properties

  1. brokerClusterName=DefaultCluster
  2. brokerName=broker-a
  3. namesrvAddr=127.0.0.1:;mq2:

在mq2上配置

conf/2m-noslave/broker-b.properties

  1. brokerClusterName=DefaultCluster
  2. brokerName=broker-b
  3. namesrvAddr=127.0.0.1:;mq1:

分别启动mq1和mq2的namesrv

  1. nohup sh bin/mqnamesrv >> logs/app.log >& &

启动mq1的broker

  1. nohup sh bin/mqbroker -c conf/2m-noslave/broker-a.properties >> logs/broker.log >& &

启动mq2的broker

  1. nohup sh bin/mqbroker -c conf/2m-noslave/broker-b.properties >> logs/broker.log >& &

在监控界面中查看

spring boot 中使用

https://www.jianshu.com/p/8c4c2c2ab62e

spring-boot-starter-rocketmq

使用的时候如果遇到rocketMQTemplate bean报错

需要配置producer

  1. rocketmq:
  2. name-server: 172.20.102.150:
  3. producer:
  4. group: ${spring.application.name}

将rocketmq.name-server 修改为 rocketmq.nameServer

RocketMq消息监听程序中消除大量的if..else

这里要注意处理tag为空的情况

  1. //根据Topic分组
  2. Map<String, List<MessageExt>> topicGroups = msgs.stream().collect(Collectors.groupingBy(MessageExt::getTopic));
  3. for (Map.Entry<String, List<MessageExt>> topicEntry : topicGroups.entrySet()) {
  4. String topic = topicEntry.getKey();
  5. //根据tags分组
  6. List<MessageExt> messageExts=topicEntry.getValue();
  7. for(MessageExt messageExt:messageExts){
  8. String tag= messageExt.getTags();
  9. if(StringUtils.isEmpty(tag)){
  10. messageExt.setTags("*");
  11. }
  12. }
  13. Map<String, List<MessageExt>> tagGroups = topicEntry.getValue().stream().collect(Collectors.groupingBy(MessageExt::getTags));
  14. for (Map.Entry<String, List<MessageExt>> tagEntry : tagGroups.entrySet()) {
  15. String tag = tagEntry.getKey();
  16. //消费某个主题下,tag的消息
  17. this.consumeMsgForTag(topic,tag,tagEntry.getValue());
  18. }
  19. }

非spring boot 中使用

添加beans

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:p="http://www.springframework.org/schema/p"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xmlns:cache="http://www.springframework.org/schema/cache"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. http://www.springframework.org/schema/beans/spring-beans.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  13. http://www.springframework.org/schema/context
  14. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  15. http://www.springframework.org/schema/tx
  16. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  17. http://www.springframework.org/schema/cache
  18. http://www.springframework.org/schema/cache/spring-cache.xsd">
  19.  
  20. <cache:annotation-driven/>
  21.  
  22. <bean id="messageListeners" class="com.rongdu.cashloan.cl.mq.MQConsumeMsgListenerProcessor"></bean>
  23.  
  24. <bean id="rocketmqConsumer" class="org.apache.rocketmq.client.consumer.DefaultMQPushConsumer" init-method="start" destroy-method="shutdown">
  25. <property name="consumerGroup" value="${rocketmq.consumer.groupName}"/>
  26. <property name="namesrvAddr" value="${rocketmq.consumer.namesrvAddr}"/>
  27. <property name="messageListener" ref="messageListeners"/>
  28. <property name="subscription">
  29. <map>
  30. <entry key="${rocketmq.consumer.topics}" value="${rocketmq.consumer.tags}" />
  31. </map>
  32. </property>
  33. <property name="consumeMessageBatchMaxSize" value="${rocketmq.consumer.consumeMessageBatchMaxSize}"></property>
  34. </bean>
  35.  
  36. <bean id="rocketMQProducer" class="org.apache.rocketmq.client.producer.DefaultMQProducer" init-method="start" destroy-method="shutdown">
  37. <property name="producerGroup" value="${rocketmq.producer.groupName}"/>
  38. <property name="namesrvAddr" value="${rocketmq.producer.namesrvAddr}"/>
  39. <!-- 失败重试次数 -->
  40. <property name="retryTimesWhenSendFailed" value="${rocketmq.producer.retryTimesWhenSendFailed}" />
  41. </bean>
  42.  
  43. </beans>

mq-beans

添加配置

  1. #该应用是否启用生产者
  2. rocketmq.producer.isOnOff=on
  3. #发送同一类消息的设置为同一个group,保证唯一,默认不需要设置,rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标示
  4. rocketmq.producer.groupName=cashloan-producer
  5. #mq的nameserver地址
  6. rocketmq.producer.namesrvAddr=172.20.102.150:
  7. rocketmq.producer.topics=cashloan_risk_control_req
  8. #消息最大长度 默认1024*(4M)
  9. rocketmq.producer.maxMessageSize=
  10. #发送消息超时时间,默认3000
  11. rocketmq.producer.sendMsgTimeout=
  12. #发送消息失败重试次数,默认2
  13. rocketmq.producer.retryTimesWhenSendFailed=
  14.  
  15. ###consumer
  16. ##该应用是否启用消费者
  17. rocketmq.consumer.isOnOff=on
  18. rocketmq.consumer.groupName=cashloan-consumer
  19. #mq的nameserver地址
  20. rocketmq.consumer.namesrvAddr=172.20.102.150:
  21. #该消费者订阅的主题和tags("*"号表示订阅该主题下所有的tags),格式:topic~tag1||tag2||tag3;topic2~*;
  22. rocketmq.consumer.topics=cashloan_risk_control_result
  23. rocketmq.consumer.tags=*
  24.  
  25. rocketmq.consumer.consumeThreadMin=
  26. rocketmq.consumer.consumeThreadMax=
  27. #设置一次消费消息的条数,默认为1条
  28. rocketmq.consumer.consumeMessageBatchMaxSize=

application-properties

生产者

  1. Message msg = new Message("cashloan_risk_control_req" /* Topic */,
  2. "TagA" /* Tag */,
  3. (String.valueOf(borrowId)).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
  4. );
  5. SendResult sendResult = producer.send(msg);

消息监听

  1. @Component
  2. public class MQConsumeMsgListenerProcessor implements MessageListenerConcurrently {
  3. private static final Logger logger = LoggerFactory.getLogger(MQConsumeMsgListenerProcessor.class);
  4.  
  5. @Override
  6. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
  7. if(CollectionUtils.isEmpty(msgs)){
  8. logger.info("接受到的消息为空,不处理,直接返回成功");
  9. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  10. }
  11. MessageExt messageExt = msgs.get();
  12. logger.info("接受到的消息为:"+messageExt.toString());
  13. if(messageExt.getTopic().equals("cashloan_risk_control")){
  14. if(messageExt.getTags().equals("borrowId")){
  15. //TODO 判断该消息是否重复消费(RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重)
  16. //TODO 获取该消息重试次数
  17. int reconsume = messageExt.getReconsumeTimes();
  18. if(reconsume ==){//消息已经重试了3次,如果不需要再次消费,则返回成功
  19. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  20. }
  21. //TODO 处理对应的业务逻辑
  22.  
  23. }
  24. }
  25. // 如果没有return success ,consumer会重新消费该消息,直到return success
  26. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  27. }
  28. }

RocketMQ的更多相关文章

  1. RocketMQ原理解析-Remoting

    Remoting2. 通信层底层传输协议 RocketMq服务器与客户端通过传递RemotingCommand来交互,通过NettyDecoder,对RemotingCommand进行协议的编码与解码 ...

  2. RocketMQ原理解析-Broker

    broker 1. broker的启动 brker的启动 Broker向namesrv注册 1. 获取namesrv的地址列表(是乱序的) 2. 遍历向每个namesrv注册topic的配置信息top ...

  3. RocketMQ原理解析-Consumer

    consumer 1.启动 有别于其他消息中间件由broker做负载均衡并主动向consumer投递消息,RocketMq是基于拉模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消 ...

  4. RocketMQ原理解析-Producer

    producer  producer 1.启动流程 Producer如何感知要发送消息的broker即brokerAddrTable中的值是怎么获得的, 1. 发送消息的时候指定会指定topic,如果 ...

  5. 分布式开放消息系统(RocketMQ)的原理与实践

    分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一 ...

  6. rocketmq生产者和消费者

    1.生产者: package com.ebways.mq.test.mq; import com.alibaba.rocketmq.client.exception.MQClientException ...

  7. rocketmq查看命令

    首先进入 RocketMQ 工程,进入/RocketMQ/bin   在该目录下有个 mqadmin 脚本 .  查看帮助:   在 mqadmin 下可以查看有哪些命令    a: 查看具体命令的使 ...

  8. rocketmq生产者部署的机器注意事项

    报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'warningP ...

  9. Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件

    引言 上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至 ...

  10. Kafka vs RocketMQ—— Topic数量对单机性能的影响-转自阿里中间件

    引言 上一期我们对比了三类消息产品(Kafka.RabbitMQ.RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务 ...

随机推荐

  1. 浅谈 drop、truncate和delete的区别

    (1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作. TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独 ...

  2. JavaBean动作元素

    用动作标签创建Javabeans实例 <jsp:useBean id="实例对象名" class="com.po.Users(类全名)" scope=&q ...

  3. 2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)

    传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi​∑ai​​的最大值. 思路:一眼要01分数规划, ...

  4. BJOI2018 简要题解

    二进制 序列上线段树维护DDP好题. 题解可以看这篇 代码: #include<bits/stdc++.h> #define ri register int using namespace ...

  5. 使用 mybatis plus 动态数据源

    1.pom.xml 增加 <dependency> <groupId>com.baomidou</groupId> <artifactId>dynami ...

  6. 卸载HDP大数据平台

    使用以下说明卸载HDP: 停止所有已安装的HDP服务.请参阅HDP参考指南中的停止HDP服务. 如果安装了Knox,请在所有群集节点上运行以下命令: 对于RHEL / CentOS / Oracle ...

  7. 单点登陆cas

    1.TGC:Ticket-granting cookie,存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证.TGT封装了TG ...

  8. ABAP 常见系统表

    TRDIRT Program nameTFTIT Function module nameDD02T Table name

  9. 3、MHC主要组织相容性复合体

    主要组织相容性复合体 (major histocompatibility complex MHC) 位于脊椎动物某对染色体上紧密连锁的基因群,其编码的蛋白是主要组织相容性抗原,是移植排斥反应的主要抗原 ...

  10. webpack多页面配置

    const path = require('path'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const Html ...