一、RocketMQ介绍
二、相关概念
参考文档1
参考文档2
Producer:消息生产者
Producer Group:消息生产者组,发送同类消息的一个消息生产组
Consumer:消费者
Consumer Group:消费同个消息的多个实例
Tag:标签,子主题(二级分类),用于区分同一个主题下的不同业务的消息
Topic:主题
Message:消息
Broker:MQ程序,接收生产的消息,提供给消费者消费的程序
Name Server:给生产和消费者提供路由信息,提供轻量级的服务发现和路由
三、本地部署
-
官网下载
官网下载安装包
选择:Binary: rocketmq-all-4.7.0-bin-release.zip [PGP] [SHA512]下载;
解压到非中文且不包含空格的路径 -
配置环境变量
-
启动MQ
进入MQ的bin目录路径,启动cmd,输入start mqnamesrv.cmd
启动MQ
启动成功界面:
-
附:启动报错解决
jdk版本过高,使用jdk8或9
MQ路径有空格 -
启动Broker程序
进入MQ的bin目录路径,启动cmd,输入start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
启动 Broker 程序
两个程序启动后,就可以使用RocketMQ启动成功标志:
附:启动报错解决
解决办法: 打开runbroker.cmd,然后将‘%CLASSPATH%’加上英文双引号。保存并重新执行start语句。
四、springboot整合RocketMQ
-
加入依赖
<properties> <java.version>1.8</java.version> <!--RocketMQ版本号--> <rocketmq.version>4.7.0</rocketmq.version> </properties> <!--RocketMQ 相关依赖--> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <!--RocketMQ版本号--> <version>${rocketmq.version}</version> </dependency> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-common</artifactId> <version>${rocketmq.version}</version> </dependency>
-
配置application.properties文件
# 消费者的组名 apache.rocketmq.consumer.pushConsumer=orderConsumer # 生产者的组名 apache.rocketmq.producer.producerGroup=Producer # NameServer地址 (名称服务,路由发现服务,127.0.0.1:9876是rocker提供的ip) apache.rocketmq.namesrvAddr=127.0.0.1:9876
-
创建生产者 — 用于生产消息
定义producerGroup
和namesrvAddr
两个变量,使用@Value
获取application.properties配置文件的变量值;
创建 默认生产者 方法,使用 注解:@PostConstruct
/** * 生产者 ---用户生产消息 */ @Component public class ProducerMsg { @Value("${apache.rocketmq.producer.producerGroup}") private String producerGroup; //生产者的组 @Value("${apache.rocketmq.namesrvAddr}") private String namesrvAddr; //NameServer地址 private DefaultMQProducer producer; //默认生产者 public DefaultMQProducer getProducer() { return producer; } /** * @PostConstruct 会在servlet初始化时执行,只执行一次 * 作用:让当前方法在 构造函数之后,init方法之前执行 */ @PostConstruct public void defaultMQProducer(){ //1.创建一个默认生产者对象,作用于生产消息 producer = new DefaultMQProducer(producerGroup); //2.绑定生产者和namesrvAddr producer.setNamesrvAddr(namesrvAddr); //3.发送消息 try { producer.start(); } catch (MQClientException e) { e.printStackTrace(); } } }
-
测试 ---- 生产信息
创建controller层@RestController @RequestMapping("/mq") public class OrderController { @Autowired private ProducerMsg producerMsg; /** * * @param msg 发送的消息 * @param tag 二级标签 * @return */ @GetMapping("/rocket") public Object msg(String msg,String tag){ //1.创建消息载体对象 Message Message message = new Message("orderTopic",tag,msg.getBytes()); //2.通过注入的消息提供者对象发送消息 try { SendResult send = producerMsg.getProducer().send(message); System.out.println("消息ID:" + send.getMsgId() + ";消息发送状态:" + send.getSendStatus()); } catch (MQClientException e) { e.printStackTrace(); } catch (RemotingException e) { e.printStackTrace(); } catch (MQBrokerException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return JsonData.buildSuccess(); } }
-
创建消费者 ---- 消费信息
定义pushConsumer
和namesrvAddr
两个变量,提供一个空的构造器;
提供 默认的消费者 , 使用 注解:@PostConstruct
/** * 消费者 --消费信息 */ @Component public class ConsumerMsg { @Value("${apache.rocketmq.consumer.pushConsumer}") private String pushConsumer; //消费者组名 @Value("${apache.rocketmq.namesrvAddr}") private String namesrvAddr; //NameServer地址 //提供一个空构造器 public ConsumerMsg() { } @PostConstruct //提供默认的消费者 public void defaultMsgConsumer(){ //1.指定消费者所消费的主题(队列) tag(2及标签,用于过滤消息) DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(pushConsumer); //说明,如果要消费所有tag,用通配符*代替所有tag,如果明确指定 try { consumer.subscribe("orderTopic","*"); } catch (MQClientException e) { e.printStackTrace(); } //2.指定消费的策略(从所有的消息开头位置执行, 还是从消息尾部执行)指定消费的顺序 consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); //TODO consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {//注册消息监听器,用的lambda try { for (MessageExt messageExt : list) { System.out.println("messageExt: " + messageExt);//输出消息内容 String messageBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET); System.out.println("消费响应:msgId : " + messageExt.getMsgId() + ", msgBody : " + messageBody);//输出消息内容 } } catch (Exception e) { e.printStackTrace(); return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试 } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功 }); //3.开启监听 消费消息 try { consumer.start(); } catch (MQClientException e) { e.printStackTrace(); } } }
-
测试,查看消费信息(启动后会先输出 生产的待用消息)