springboot-JMS消息服务-RocketMQ

一、RocketMQ介绍
springboot-JMS消息服务-RocketMQ_第1张图片
二、相关概念
参考文档1
参考文档2

	Producer:消息生产者
    Producer Group:消息生产者组,发送同类消息的一个消息生产组
    Consumer:消费者
    Consumer Group:消费同个消息的多个实例
    Tag:标签,子主题(二级分类),用于区分同一个主题下的不同业务的消息
    Topic:主题
    Message:消息
    Broker:MQ程序,接收生产的消息,提供给消费者消费的程序
    Name Server:给生产和消费者提供路由信息,提供轻量级的服务发现和路由

三、本地部署

  1. 官网下载
    官网下载安装包
    选择:Binary: rocketmq-all-4.7.0-bin-release.zip [PGP] [SHA512]下载;
    解压到非中文且不包含空格的路径

  2. 配置环境变量
    springboot-JMS消息服务-RocketMQ_第2张图片

  3. 启动MQ
    进入MQ的bin目录路径,启动cmd,输入 start mqnamesrv.cmd 启动MQ
    启动成功界面:
    springboot-JMS消息服务-RocketMQ_第3张图片

  4. 附:启动报错解决
    jdk版本过高,使用jdk8或9springboot-JMS消息服务-RocketMQ_第4张图片
    MQ路径有空格springboot-JMS消息服务-RocketMQ_第5张图片

  5. 启动Broker程序
    进入MQ的bin目录路径,启动cmd,输入 start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true 启动 Broker 程序
    两个程序启动后,就可以使用RocketMQ

    启动成功标志:
    在这里插入图片描述
    附:启动报错解决
    解决办法: 打开runbroker.cmd,然后将‘%CLASSPATH%’加上英文双引号。保存并重新执行start语句。
    在这里插入图片描述

四、springboot整合RocketMQ

  1. 加入依赖

    	<properties>
            <java.version>1.8java.version>
            
            <rocketmq.version>4.7.0rocketmq.version>
        properties>
    	
    	
    	<dependency>
    		<groupId>org.apache.rocketmqgroupId>
    		<artifactId>rocketmq-clientartifactId>
    		
    		<version>${rocketmq.version}version>
    	dependency>
    	<dependency>
    		<groupId>org.apache.rocketmqgroupId>
    		<artifactId>rocketmq-commonartifactId>
    		<version>${rocketmq.version}version>
    	dependency>
    
  2. 配置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
    
  3. 创建生产者 — 用于生产消息
    定义producerGroupnamesrvAddr两个变量,使用@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();
            }
        }
    }
    
  4. 测试 ---- 生产信息
    创建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();
        }
    }
    
  5. 创建消费者 ---- 消费信息
    定义 pushConsumernamesrvAddr 两个变量,提供一个空的构造器;
    提供 默认的消费者 , 使用 注解:@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();
            }
        }
    }
    
  6. 测试,查看消费信息(启动后会先输出 生产的待用消息)

你可能感兴趣的:(spring框架)