• springboot之RocketMq实现


    环境:win10

    1、下载安装包

    http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release

    2、解压到本地,并到系统环境中设置环境变量(必须添加,否则启动不了,也会提示你添加)

    3、进入bin目录,运行broker和nameserver

    start mqnamesrv.cmd
    start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

    4、下载mq的监控web

    https://github.com/apache/rocketmq-externals/archive/master.zip

     5、web界面进行配置

    进入 D:software
    ocketmq
    ocketmq-externals-master
    ocketmq-consolesrcmain
    esources,
    找到application.properties文件

    6、编译打包

    进入 D:software
    ocketmq
    ocketmq-externals-master
    ocketmq-console 
    运行mvn clean package -Dmaven.test.skip=true

    7、运行编译好的jar

    进入D:software
    ocketmq
    ocketmq-externals-master
    ocketmq-console	arget
    运行java -jar rocketmq-console-ng-1.0.0.jar

    8、查看web监控界面

    http://localhost:8080

    #########springboot集成###########

    1、pom.xml文件添加依赖

         <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-client</artifactId>
                <version>4.4.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-remoting</artifactId>
                <version>4.4.0</version>
            </dependency>

    2、yml文件添加rocketmq配置

    apache:
      rocketmq:
        #消费者的配置
        consumer:
          pushConsumer: myConsumer
        #生产者的配置
        producer:
          producerGroup: myGroup
        namesrvAddr: 127.0.0.1:9876

    3、生产者类RocketProducer

    import org.apache.commons.lang3.time.StopWatch;
    import org.apache.rocketmq.client.exception.MQBrokerException;
    import org.apache.rocketmq.client.exception.MQClientException;
    import org.apache.rocketmq.client.producer.DefaultMQProducer;
    import org.apache.rocketmq.client.producer.SendResult;
    import org.apache.rocketmq.common.message.Message;
    import org.apache.rocketmq.remoting.common.RemotingHelper;
    import org.apache.rocketmq.remoting.exception.RemotingException;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import javax.annotation.PostConstruct;
    import java.io.UnsupportedEncodingException;
    
    @Component
    public class RocketProducer {
    
        /**
         * 生产者的组名
         */
        @Value("${apache.rocketmq.producer.producerGroup}")
        private String producerGroup; //myGroup
    
        private DefaultMQProducer producer;
        /**
         * NameServer 地址
         */
        @Value("${apache.rocketmq.namesrvAddr}")
        private String namesrvAddr; //127.0.0.1:9876
    
        @PostConstruct
        public void defaultMQProducer() {
    
            //生产者的组名
            producer= new DefaultMQProducer(producerGroup);
            //指定NameServer地址,多个地址以 ; 隔开
            producer.setNamesrvAddr(namesrvAddr);
            producer.setVipChannelEnabled(false);
            try {
                producer.start();
                System.out.println("-------->:producer启动了");
            } catch (MQClientException e) {
                e.printStackTrace();
            }
        }
    
        public String send(String topic,String tags,String body) throws InterruptedException, RemotingException, MQClientException, MQBrokerException, UnsupportedEncodingException {
            Message message = new Message(topic, tags, body.getBytes(RemotingHelper.DEFAULT_CHARSET));
            StopWatch stop = new StopWatch();
            stop.start();
            SendResult result = producer.send(message);
            System.out.println("发送响应:MsgId:" + result.getMsgId() + ",发送状态:" + result.getSendStatus());
            stop.stop();
            return "{"MsgId":""+result.getMsgId()+""}";
        }
    }

    4、消费者类RocketConsumer

    import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
    import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
    import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
    import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
    import org.apache.rocketmq.common.message.Message;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class RocketConsumer implements CommandLineRunner {
    
        /**
         * 消费者
         */
        @Value("${apache.rocketmq.consumer.pushConsumer}")
        private String pushConsumer;  //myConsumer
    
        /**
         * NameServer 地址
         */
        @Value("${apache.rocketmq.namesrvAddr}")
        private String namesrvAddr; //127.0.0.1:9876
    
    
        /**
         * 初始化RocketMq的监听信息,渠道信息
         */
        public void messageListener(){
    
            DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("SpringBootRocketMqGroup");
    
            consumer.setNamesrvAddr(namesrvAddr);
            try {
    
                // 订阅PushTopic下Tag为push的消息,都订阅消息
                consumer.subscribe("firstPushTopic", "push");
    
                // 程序第一次启动从消息队列头获取数据
                consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
                //可以修改每次消费消息的数量,默认设置是每次消费一条
                consumer.setConsumeMessageBatchMaxSize(1);
    
                //在此监听中消费信息,并返回消费的状态信息
                consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
    
                    // 会把不同的消息分别放置到不同的队列中
                    for(Message msg:msgs){
    
                        System.out.println("接收到了消息:"+new String(msg.getBody()));
                    }
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                });
    
                consumer.start();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void run(String... args) throws Exception {
            this.messageListener();
        }
    }

    5、controller中编写发送消息

     @Autowired
        private RocketProducer producer;
    
        @RequestMapping("/myFirstProducer")
        public String pushMsg(String msg){
            try {
                return producer.send("firstPushTopic","push",msg);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (RemotingException e) {
                e.printStackTrace();
            } catch (MQClientException e) {
                e.printStackTrace();
            } catch (MQBrokerException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return "ERROR";
        }

    完毕!

    自己访问,并通过web界面访问

    FAQ

    1、出现磁盘不足问题,rocketmq默认的磁盘水位为88%,但是本人的磁盘使用是0.94了,所以会报这种错。

    org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [32]ms, Topic: firstPushTopic, BrokersSent: [DESKTOP-N10172E, DESKTOP-N10172E, DESKTOP-N10172E]
    See http://rocketmq.apache.org/docs/faq/ for further details.
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:632)
    Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 14  DESC: service not available now, maybe disk full, CL:  0.94 CQ:  0.94 INDEX:  0.94, maybe your broker machine memory too small.
    For more information, please visit the url, http://rocketmq.apache.org/docs/faq/
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.processSendResponse(MQClientAPIImpl.java:556)
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:358)
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:340)
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:294)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:807)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:551)
        ... 59 more

    解决方法:找到runbroker.cmd文件,在文件中添加

    set "JAVA_OPT=%JAVA_OPT% -Drocketmq.broker.diskSpaceWarningLevelRatio=0.98"
  • 相关阅读:
    批量处理进程
    稳定寻找app package和activity的办法
    python yield
    记一次 Appium socket hang up 问题 以及小米手机关闭对uiautomator2.server的省电策略
    MySQL数据库连接不上、密码修改问题
    二、观察者模式(Observer Pattern)《HeadFirst设计模式》读书笔记
    一、策略模式(Strategy Pattern)《HeadFirst设计模式》读书笔记
    Java Scanner类中next()和nextLine()方法的区别
    Mybatis 9、Lombok
    Mybatis 8、使用注解开发
  • 原文地址:https://www.cnblogs.com/ywjfx/p/10767799.html
Copyright © 2020-2023  润新知