RocketMq整合springBoot的日常使用

       现在使用rocketmq基本上都是搭载spring配合使用的,现在就以springBoot作为演示。

1.首先先倒入所需依赖包

<dependency>
    <groupId>com.alibaba.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>3.2.6</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.60</version>
</dependency>
备注:这里切记要倒入正确的fastjson包,否则会导致收发消息报错:路由异常说该nameserver下没有配置此topic

2.分别启动nameserver和broker

> nohup sh bin/mqnamesrv &
> nohup sh bin/mqbroker -n localhost:9876&
备注:切记一定要先查看自身的ip,启动broker记得查看broker日志是否成功 
broker日志地址:~/logs/rocketmqlogs/broker.log
2019-12-02 13:53:12 INFO brokerOutApi_thread_2 - register broker[0]to name server 192.168.142.80:9876 OK

   查看java程序进程,看是否有启动namesev 和 broker 

>jps

6599 RemoteMavenServer36
6743 BrokerStartup
6747 Jps
6653 Launcher
6670 NamesrvStartup  

3.停止Nameserver 和 Broker服务

首先进入bin目录会存在这么一个服务mqshutdown,当然也存在刚刚启动的broker和nameserver服务

所以停止nameServer 和 Broker  命令如下:

(base) bogon:rocketmq-all-4.6.0-bin-release humingming$ sh bin/mqshutdown namesrv  --停止注册发现状态服务
The mqnamesrv(12524) is running...
Send shutdown request to mqnamesrv(12524) OK
(base) bogon:rocketmq-all-4.6.0-bin-release humingming$ sh bin/mqshutdown broker --停止broker服务
The mqbroker(12534) is running...
Send shutdown request to mqbroker(12534) OK
[3]+  Exit 143                nohup sh bin/mqnamesrv

4.编写 生产者和消费者例子

package rocketmq.day01;

import com.alibaba.rocketmq.client.exception.MQBrokerException;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.client.producer.SendResult;
import com.alibaba.rocketmq.common.message.Message;
import com.alibaba.rocketmq.remoting.exception.RemotingException;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author heian
 * @create 2019-11-28-8:23 下午
 * @description
 */
public class ProducerDemo {

    public static void main(String[] args) throws MQClientException {
        DefaultMQProducer producer = new DefaultMQProducer("unique_producer_group__name");
        producer.setNamesrvAddr("192.168.142.80:9876");
        producer.start();
        for (int i = 0; i < 1; i++) {
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat();
            String format = sdf.format(date);
            Message message = new Message("topicName", String.valueOf(i),format.getBytes());
            SendResult sendResult= new SendResult();
            try {
                 sendResult = producer.send(message);
            } catch (RemotingException  |MQBrokerException | InterruptedException e) {
                System.out.println("消息发送失败:" + sendResult.getMsgId());
                e.printStackTrace();
            }
            System.out.println("key:"+i + "消息的发送结果为:" + sendResult.toString() + "消息ID为:" + sendResult.getMsgId());
        }

    }

}
package rocketmq.day01;

import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
import com.alibaba.rocketmq.common.message.MessageExt;

import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * @author heian
 * @create 2019-11-28-8:51 下午
 * @description
 */
public class ConsumeDemo {

    public static void main(String[] args) throws MQClientException {
        DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer("unique_consume_group_name");
        defaultMQPushConsumer.setNamesrvAddr("192.168.142.80:9876");
        // 设置消费地点,从最第一个进行消费(其实就是消费策略)
        defaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        defaultMQPushConsumer.subscribe("topicName","*");
        defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                byte[] body = list.get(0).getBody();
                try {
                    String ms = new String(body,"utf-8");
                    System.out.println(Thread.currentThread().getName() + "监听到消息:" + ms);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        defaultMQPushConsumer.start();
    }

}

5. 分别启动生产者和消费者 

控制台打印信息如下:

--生产者控制台
key:0消息的发送结果为:SendResult [sendStatus=SEND_OK, msgId=C0A88E5000002A9F0000000000070774, messageQueue=MessageQueue [topic=topicName, brokerName=bogon, queueId=0], queueOffset=20]消息ID为:C0A88E5000002A9F0000000000070774
--消费者控制台
ConsumeMessageThread_1监听到消息:19-12-2 下午2:00

 备注:可以发现一则消息发送前后必须先定义

  1. GroupName(生产组名和消费组名)
  2. NameServer地址及端口(broker必须先注册到Nmaesrv上,有点类似于nio中的serverSocketChannel.register(selector, 0)),就是服务端开启一个通道,客户端往通道内写数据,服务端用selector去一对多监听多个客户端
  3. topic名称或者更细的tags

此外:1.rocketmq读写队列默认是8个,生产上配置则是按照实例数的两倍,比如生产上有8个微服务,则一般配置16个读写队列

           2.消费端线程监听默认是最大起20个线程监听

图形化界面管理mq集群

        对于rocketmq新手如果我们要查看消息的一些轨迹或者topic的一些信息啊,使用mqadmin命令有点不切实际(mqadmin命令),所以需要又一个类似于navicat一样的可视化界面。

       运维服务是一个springboot项目,需要从GitHub上下载地址为:https://github.com/apache/rocketmq-externals  进入后我们需要下载这些组件到本地,我们用到的只有rocketmq-console这个项目文件夹。

  1. 自身你可以用idea打开看其源码,在这个boot项目中又一个properties文件,将namesrv地址配置成自身的IP地址:rocketmq.config.namesrvAddr=localhost:9876  如果是集群部署则 ip:9876;ip2;9876
  2. 将boot项目打成jar包 直接使用命令:进入到/Users/humingming/IdeaProjects/rocketmq-console 文件夹执行此命令
    编译命令:mvn clean package -Dmaven.test.skip=true(注意:不要直接使用mvn package,会提示很多错误)

    会在boot项目中生成target文件夹并在其中生成jar文件,我们主要用到的就是此:rocketmq-console-ng-1.0.1.jar

  3.  切换到该jar包目录直接运行:java -jar rocketmq-console-ng-1.0.1.jar  可以直接在idea中输入这些命令,直接打包和运行jar包

    java -jar rocketmq-console-ng-1.0.1.jar
    

    备注:如果ip地址不对,或者端口冲突,可以在运行jar后面加个后缀

  4. 直接访问运行好的jar (其实就是运行了一个sprongboot项目) http://localhost:8080/

    至此,开启我们的rocketmq 学习之旅!!!

发布了73 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40826106/article/details/103347083