linux下搭建rocketmq,springboot使用rocketmq

1、下载地址 

http://rocketmq.apache.org/dowloading/releases/ ,下载Binary版

2、前置环境

jdk1.8

3、部署流程

  3.1  将下载好的压缩文件解压到如下路径下/usr/local/rocketmq-all-4.7.0-bin-release
  3.2 启动nameserver

      启动命令:nohup sh bin/mqnamesrv &

        查看日志:tail -f ~/logs/rocketmqlogs/namesrv.log

       3.3 启动broker

      启动命令:nohup sh bin/mqbroker -n localhost:9876 &

           查看日志:tail -f ~/logs/rocketmqlogs/broker.log

       3.4、启动时可能会报内存不足,解决办法

      修改bin下面的borker.sh和runserver.sh,将内存调到你机器能够承受的内存大小

      broker.sh:JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g"

      runserver.sh:JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

   3.5、关闭服务命令

     关闭broker命令:sh bin/mqshutdown broker
       关闭nameserver命令:sh bin/mqshutdown namesrv

4、springboot使用rocketmq

    4.1 pom.xml添加依赖

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

    4.2 yml文件添加rocketmq配置

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

    4.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.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();
    }
}

  4.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";
    }

结果

发送响应:MsgId:AC1885510FD818B4AAC269579A020000,发送状态:SEND_OK
接收到了消息:111
发送响应:MsgId:AC1885510FD818B4AAC26958129C0001,发送状态:SEND_OK
接收到了消息:你好

 

猜你喜欢

转载自www.cnblogs.com/lijiayong/p/13171822.html