• springboot2 整合 rocketmq


      引入依赖pom:

    <!-- TCP Java SDK ,生产者com.aliyun.openservices.ons.api.Producer,消费者,以及消息,消息内容Message message, ConsumeContext context等类 -->
            <dependency>
                <groupId>com.aliyun.openservices</groupId>
                <artifactId>ons-client</artifactId>
                <version>1.8.0.Final</version>
            </dependency>

    初始化生产者,和消费者,直接上代码

    package com.example.demo.rocketmq.init;
    
    import java.util.Date;
    import java.util.Properties;
    import java.util.UUID;
    
    import javax.annotation.PostConstruct;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import com.aliyun.openservices.ons.api.Message;
    import com.aliyun.openservices.ons.api.ONSFactory;
    import com.aliyun.openservices.ons.api.Producer;
    import com.aliyun.openservices.ons.api.PropertyKeyConst;
    import com.aliyun.openservices.ons.api.SendResult;
    import com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl;
    import com.aliyun.openservices.shade.com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl;
    import com.aliyun.openservices.shade.com.alibaba.rocketmq.client.producer.DefaultMQProducer;
    
    /** 
     * 初始化生产者
    * @author zel 
    * @date 2019年3月31日 上午11:37:27 
    *  
    */
    @Component
    public class RocketmqProducerInit {
        private static final Logger logger = LoggerFactory.getLogger(RocketmqProducerInit.class);
        
    //    @Value("${rocketmq.topic}")
    //    private String topic;
        
        @Value("${rocketmq.groupid}")
        private String groupId;
    
        @Value("${rocketmq.accessKey}")
        private String accessKey;
    
        @Value("${rocketmq.secretKey}")
        private String secretKey;
    
        @Value("${rocketmq.namesrvAddr}")
        private String namesrvAddr;
    
        private static Producer producer;
    
        private static class SingletonHolder {
            private static final RocketmqProducerInit INSTANCE = new RocketmqProducerInit();
        }
    
        private RocketmqProducerInit() {
        }
    
        public static final RocketmqProducerInit getInstance() {
            return SingletonHolder.INSTANCE;
        }
    
        @PostConstruct
        public void init() {
            // producer 实例配置初始化
            Properties properties = new Properties();
            properties.setProperty(PropertyKeyConst.GROUP_ID, groupId);
            // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.put(PropertyKeyConst.AccessKey, accessKey);
            // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.put(PropertyKeyConst.SecretKey, secretKey);
            // 设置发送超时时间,单位毫秒
            properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, String.valueOf(1000*3));//超时时间
            // 设置 TCP 接入域名,到控制台的实例基本信息中查看
            properties.put(PropertyKeyConst.NAMESRV_ADDR,namesrvAddr);
            producer = ONSFactory.createProducer(properties);
            producer.start();
            //获取是否运行状态
    //        if (producer instanceof ProducerImpl) {
    //            System.out.println("它是DefaultMQProducerImpl实例");
    //            ProducerImpl producerImpl = (ProducerImpl) producer;
    //            DefaultMQProducerImpl defaultMQProducerImpl = producerImpl.getDefaultMQProducer().getDefaultMQProducerImpl();
    //            logger.info("start前状态字段值:" + defaultMQProducerImpl.getServiceState());
    //            producer.start();
    //            logger.info("start后状态字段值:" + defaultMQProducerImpl.getServiceState());
    //        }
        }
    
        /**
         * @param type simple:无序消息;order:顺序消息;Transaction:事务消息;
         * @return
         */
        public Producer getProducer() {
            return producer;
        }
        
    }
    package com.example.demo.rocketmq.init;
    
    import java.util.Properties;
    
    import javax.annotation.PostConstruct;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import com.aliyun.openservices.ons.api.Consumer;
    import com.aliyun.openservices.ons.api.ONSFactory;
    import com.aliyun.openservices.ons.api.PropertyKeyConst;
    import com.example.demo.controller.RocketmqEvaluateListener;
    import com.example.demo.controller.RocketmqSMSReminderListener;
    import com.example.demo.controller.RocketmqWWlogListener;
    
    /** 
     * 初始化消费者
    * @author zel 
    * @date 2019年3月31日 上午11:38:16 
    *  
    */
    @Component
    //@Configuration
    //@ConditionalOnProperty(value = "rocketmqConsumerInit.enabled", havingValue = "true", matchIfMissing = true)
    public class RocketmqConsumerInit {
          private Logger logger = LoggerFactory.getLogger(RocketmqConsumerInit.class);
          
          private static Consumer consumer;
          
              @Value("${rocketmq.topic}")
            private String topic;
            @Value("${rocketmq.topicsms}")
            private String topicsms;
              @Value("${rocketmq.tag}")
            private String tag;
            @Value("${rocketmq.groupid}")
            private String groupId;
    //        @Value("${rocketmq.topicevaluate}")
    //        private String topicevaluate;
            
            
            @Value("${rocketmq.accessKey}")
            private String accessKey;
        
            @Value("${rocketmq.secretKey}")
            private String secretKey;
        
            @Value("${rocketmq.namesrvAddr}")
            private String namesrvAddr;
    
            @PostConstruct
          public void consumerFactory(){//不同消费者 这里不能重名
            Properties consumerProperties = new Properties();
         // 您在控制台创建的 Group ID
            consumerProperties.put(PropertyKeyConst.GROUP_ID, groupId);
            // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
            consumerProperties.put(PropertyKeyConst.AccessKey, accessKey);
            // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
            consumerProperties.put(PropertyKeyConst.SecretKey, secretKey);
            // 设置 TCP 接入域名,到控制台的实例基本信息中查看
            consumerProperties.put(PropertyKeyConst.NAMESRV_ADDR,namesrvAddr);
            // 集群订阅方式 (默认)
            // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
            // 广播订阅方式
            // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING);
            consumer = ONSFactory.createConsumer(consumerProperties);
            logger.info("topic:"+topic+",tag:"+tag);
            consumer.subscribe(topic, tag, new RocketmqWWlogListener());
    //        consumer.subscribe("testtopic", "TagA2BPublishTest", new RocketmqTest1Listener());
            //订阅另外一个 状态发送变化发送短信Topic
            consumer.subscribe(topicsms, "*", new RocketmqSMSReminderListener());
          //订阅另外一个 自动评价 Topic
            //consumer.subscribe(topicevaluate, "*", new RocketmqEvaluateListener());
    //        consumer.subscribe(topicsms, tagSMS, new MessageListener() { //订阅多个 Tag
    //            public Action consume(Message message, ConsumeContext context) {
    //                logger.info("短信消息队列消费监听Receive: " + new String(message.getBody()));
    //                //调用发送短信接口
    //                return Action.CommitMessage;
    //            }
    //        });
            //在发送消息前,必须调用start方法来启动consumer,只需调用一次即可,当项目关闭时,自动shutdown
            consumer.start();
            logger.info("ConsumerConfig start success.");
          }
            /**
             * 初始化消费者
             * @return
             */
            public Consumer getconsumer(){
                return consumer;
            }
    }

    生产者测试类:使用测试的topic【testtopic】测试

    1. 设置基本属性【GroupId、AccessKey 、SecretKey、TCP 接入域名等】
    2. 创建生产者
    3. 并.Start(),
    4. 发送消息.send(msg【topic、tag、Message Body任何二进制形式的数据】)
    5. 根据Message类型(不同topic、tag)发送不同消息给不同订阅者
    package com.example.demo.rocketmq;
    
    import com.aliyun.openservices.ons.api.Message;
    import com.aliyun.openservices.ons.api.Producer;
    import com.aliyun.openservices.ons.api.SendResult;
    import com.aliyun.openservices.ons.api.ONSFactory;
    import com.aliyun.openservices.ons.api.PropertyKeyConst;
    
    import java.util.Date;
    import java.util.Properties;
    
    public class ProducerTest {
        public static void main(String[] args) {
            Properties properties = new Properties();
            properties.setProperty(PropertyKeyConst.GROUP_ID, "GID_testgroup");
            // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.put(PropertyKeyConst.AccessKey,"LTAId2oS8TzH82lH");
            // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.put(PropertyKeyConst.SecretKey, "abHRyVHZYHmeBCEmM6uXQaQXbbWHtk");
            //设置发送超时时间,单位毫秒
            properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
            // 设置 TCP 接入域名,到控制台的实例基本信息中查看
            properties.put(PropertyKeyConst.NAMESRV_ADDR,
              "http://MQ_INST_1356501_BaSQ7VE8.mq-internet-access.mq-internet.aliyuncs.com:80");
    
            Producer producer = ONSFactory.createProducer(properties);
            // 在发送消息前,必须调用 start 方法来启动 Producer,只需调用一次即可
            producer.start();
    
            //循环发送消息
            for (int i = 0; i < 100; i++){
                Message msg = new Message( //
                    // Message 所属的 Topic
                    "testtopic",
                    // Message Tag 可理解为 Gmail 中的标签,对消息进行再归类,方便 Consumer 指定过滤条件在 MQ 服务器过滤
                    "TagA",
                    // Message Body 可以是任何二进制形式的数据, MQ 不做任何干预,
                    // 需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
                    "Hello MQ".getBytes());
                // 设置代表消息的业务关键属性,请尽可能全局唯一。
                // 以方便您在无法正常收到消息情况下,可通过阿里云服务器管理控制台查询消息并补发
                // 注意:不设置也不会影响消息正常收发
                msg.setKey("ORDERID_" + i);
    
                try {
                    SendResult sendResult = producer.send(msg);
                    // 同步发送消息,只要不抛异常就是成功
                    if (sendResult != null) {
                        System.out.println(new Date() + " Send mq message success. Topic is:" + msg.getTopic() + " msgId is: " + sendResult.getMessageId());
                    }
                }
                catch (Exception e) {
                    // 消息发送失败,需要进行重试处理,可重新发送这条消息或持久化这条数据进行补偿处理
                    System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
                    e.printStackTrace();
                }
            }
    
            // 在应用退出前,销毁 Producer 对象
            // 注意:如果不销毁也没有问题
            producer.shutdown();
        }
    }
    View Code

    消费者测试类:

    1. 设置基本属性【GroupId、AccessKey 、SecretKey、TCP 接入域名、订阅方式等】,
    2. 创建消费者,
    3. 并订阅subscribe(topic, tag, MessageListener接口实现类实例【内部实现consume方法】)
    4. 订阅多个不同Message(不同topic、tag),不同consume方法。
    package com.example.demo.rocketmq;
    
    import com.aliyun.openservices.ons.api.Action;
    import com.aliyun.openservices.ons.api.ConsumeContext;
    import com.aliyun.openservices.ons.api.Consumer;
    import com.aliyun.openservices.ons.api.Message;
    import com.aliyun.openservices.ons.api.MessageListener;
    import com.aliyun.openservices.ons.api.ONSFactory;
    import com.aliyun.openservices.ons.api.PropertyKeyConst;
    import java.util.Properties;
    
    public class ConsumerTest {
        public static void main(String[] args) {
            Properties properties = new Properties();
            // 您在控制台创建的 Group ID
            properties.put(PropertyKeyConst.GROUP_ID, "GID_testgroup");
            // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.put(PropertyKeyConst.AccessKey, "LTAId2oS8TzH82lH");
            // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.put(PropertyKeyConst.SecretKey, "abHRyVHZYHmeBCEmM6uXQaQXbbWHtk");
            // 设置 TCP 接入域名,到控制台的实例基本信息中查看
            properties.put(PropertyKeyConst.NAMESRV_ADDR,
                "http://MQ_INST_1356501_BaSQ7VE8.mq-internet-access.mq-internet.aliyuncs.com:80");
            // 集群订阅方式 (默认) 分摊消费,即:生产20条消息,启动两个消费者,两个消费者消费加起来一共消费20条(11+9条,10+10条)
            // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
            // 广播订阅方式,启动两个消费者,理论上是各自消费二十条数据,消费端的消费方式是多线程消费的
            // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING);
            Consumer consumer = ONSFactory.createConsumer(properties);
            consumer.subscribe("testtopic", "TagA||TagB", new MessageListener() { //订阅多个 Tag
                public Action consume(Message message, ConsumeContext context) {
                    System.out.println("Receive: " + message);
                    return Action.CommitMessage;
                }
            });
            //订阅另外一个 Topic(订阅多个topic,同时要保证consumer里的多个消费者实例订阅关系一致性)
            consumer.subscribe("TopicTestMQ-Other", "*", new MessageListener() { //订阅全部 Tag
                public Action consume(Message message, ConsumeContext context) {
                    System.out.println("Receive: " + message);
                    return Action.CommitMessage;
                }
            });
            consumer.start();
            System.out.println("Consumer Started");
        }
    }
    View Code

     可根据需要发送不同类型消息到消息队列

     

    源码,是痛苦的,又是快乐的,如果没有这痛苦,也就没有了这快乐!
  • 相关阅读:
    每一次要fix的pr
    docker && k8s
    beisen
    c++迭代器失效问题
    视频分析
    视频分析记录
    深信服实习生笔试题-20190315
    laravel接口设计
    tensorflow利用预训练模型进行目标检测(四):检测中的精度问题以及evaluation
    tensorflow利用预训练模型进行目标检测(三):将检测结果存入mysql数据库
  • 原文地址:https://www.cnblogs.com/erlongxizhu-03/p/10580962.html
Copyright © 2020-2023  润新知