SpringBoot整合RocketMQ入门案例

ubuntu环境搭建RocketMQ

我在win10安装一直找不到dt.jar,so只能去linus装了。

RocketMQ官网说这样安装,但是不太行,而且很慢。
在这里插入图片描述

自己下载的bin格式文件。最后终于成功。

在这里插入图片描述

详细步骤

  1. 下载RocketMQ的源码(上图示),并解压缩
unzip rocketmq-all-4.2.0-bin-release.zip
  1. 在解压缩的目录中,进入bin目录,视情况修改runbroker.sh和runserver.sh文件中JVM参数,默认参数设置的内存比较大,个人电脑运行不起来,需要调小。我在腾讯云学生机上设置的下面参数是OK的。

runbroker.sh

原配置:JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"

修改为:JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m"

runserver.sh

原配置:JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

修改为:JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 插播linus命令

参考 :Linux nohup和&的功效

使用&后台运行程序:

	结果会输出到终端
	
	使用Ctrl + C发送SIGINT信号,程序免疫
	
	关闭session发送SIGHUP信号,程序关闭

使用nohup运行程序:

	结果默认会输出到nohup.out
	
	使用Ctrl + C发送SIGINT信号,程序关闭
	
	关闭session发送SIGHUP信号,程序免疫
	
平日线上经常使用nohup和&配合来启动程序:
  1. 启动Name Server :

在rocketmq目录下,执行如下语句

启动nameserver

nohup sh bin/mqnamesrv &

查看日志

tail -f ~/logs/rocketmqlogs/namesrv.log
root@VM-16-12-ubuntu:/home/lx/download/rocketmq# nohup sh bin/mqnamesrv &
[2] 5601
[1]   Exit 143                nohup sh bin/mqnamesrv

执行完上面命令之后自动来到这里,Ctrl + C结束就行,然后执行下面命令查看日志。
root@VM-16-12-ubuntu:/home/lx/download/rocketmq# nohup: ignoring input and appending output to 'nohup.out'
^C
root@VM-16-12-ubuntu:/home/lxw/download/rocketmq# tail -f ~/logs/rocketmqlogs/namesrv.log
2020-03-29 15:53:21 INFO main - tls.server.trustCertPath = null
2020-03-29 15:53:21 INFO main - tls.client.keyPath = null
2020-03-29 15:53:21 INFO main - tls.client.keyPassword = null
2020-03-29 15:53:21 INFO main - tls.client.certPath = null
2020-03-29 15:53:21 INFO main - tls.client.authServer = false
2020-03-29 15:53:21 INFO main - tls.client.trustCertPath = null
2020-03-29 15:53:21 INFO main - Using JDK SSL provider
2020-03-29 15:53:22 INFO main - SSLContext created for server
2020-03-29 15:53:22 INFO NettyEventExecutor - NettyEventExecutor service started
2020-03-29 15:53:22 INFO main - The Name Server boot success. serializeType=JSON
到这个地方就是启动成功了。

在这里插入图片描述

  1. 启动broker

启动broker语句。启动之前,先配置一个文件(适用于阿里云,腾讯云服务器)。
/rocketmq/conf/broker.conf

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
加上后面的三个。具体为啥,看我下面的一个链接
brokerIP1 = 服务器公网ip
brokerIP2 = 服务器公网ip
namesrvAddr = localhost:9876

下面就是启动了

官网推荐的,但是这有个bug
nohup sh bin/mqbroker -n localhost:9876 &
使用下面的这个,看到是在bin目录下面用了一个配置文件。
root@VM-16-12-ubuntu:/home/lx/download/rocketmq/bin# nohup sh mqbroker -c ../conf/broker.conf &

在这里插入图片描述
broker启动时使用-n localhost:9876指定nameServer,将自己的IP地址注册到nameServer
broker会将自己内网地址发送给了nameServer,producer从nameServer获取的是broker的内网IP地址,自然无法连接broker。所以后面你客户端肯定连不上。
问题描述

在这里插入图片描述

查看日志命令

tail -f ~/logs/rocketmqlogs/broker.log

在这里插入图片描述

  1. 关闭broker和server语句
在rocketmq目录下执行。

sh bin/mqshutdown broker

sh bin/mqshutdown namesrv
在rocketmq目录下执行
sh bin/mqbroker -m 来查看 broker 的配置参数

整合案例代码

创建一个SpringBoot / Maven项目,导入依赖,实测这一个就可以了。

<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.2.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Producer.java

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;

public class Producer {
    public static void main(String[] args) throws Exception {
        //创建一个消息生产者,并设置一个消息生产者组
        DefaultMQProducer producer = new DefaultMQProducer("zs_producer_group");
        //指定NameServer地址
        producer.setNamesrvAddr("服务器公网ip:9876");
        //初始化Producer,在整个应用生命周期中只需要初始化一次
        producer.start();
        for(int i = 0;i<10;i++) {
            //创建一个消息对象,指定其主题、标签和消息内容
            Message msg = new Message(
                    "topic_example_java"  /*消息主题名*/,
                    "TagA"    /*消息标签*/,
                    ("Hello Java demo RocketMQ" + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /*消息内容*/
            );
            //发送消息并返回结果
            SendResult sendResult = producer.send(msg);

            System.out.printf("%s%n", sendResult);
        }
        //一旦生产者实例不再被使用,则将其关闭,包括清理资源、关闭网络连接等
        producer.shutdown();
    }
}

Consumer.java

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

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;

public class Consumer {
    public static void main(String[] args) throws Exception {
        //创建一个消息消费者,并设置一个消息消费者组
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("zs_consumer_group");
        //指定NameServer地址
        consumer.setNamesrvAddr("服务器公网ip:9876");
        //设置Consumer第一次启动时是从队列头部还是队列尾部开始消费的
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        //订阅指定Topic下的所有消息
        consumer.subscribe("topic_example_java","*");
        //注册消息监听器
        consumer.registerMessageListener((List<MessageExt> list, ConsumeConcurrentlyContext context) ->{
            //默认list里只有一条消息,可以通过设置参数来批量接收消息
            if(list!= null) {
                for(MessageExt ext: list) {
                    try {
                        System.out.println(new Date()+ new String(ext.getBody(),"UTF-8"));
                    }catch(UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        //消息者对象在使用之前必须要调用start方法初始化
        consumer.start();
        System.out.println("消息消费者已启动");
    }
}

分别启动(先后关系不大),即可。如果有报错,可以查看我的参考链接。

搭建RocketMQ控制台

  1. 下载地址 :https://github.com/apache/rocketmq-externals.git

  2. 下载完成后进入rocketmq-externals-master\rocketmq-console\src\main\resources文件夹下,修改application.properties文件。
    在这里插入图片描述

  3. 进入\rocketmq-externals\rocketmq-console文件夹,执行mvn clean package -Dmaven.test.skip=true,编译生成。

  4. 编译成功之后,进入target目录下,拷贝图示jar包到linus服务器上。
    执行java -jar rocketmq-console-ng-1.0.1.jar,启动rocketmq-console-ng-1.0.0.jar
    然后在浏览器输入服务器IP:配置的端口
    在这里插入图片描述

在这里插入图片描述

问题总结

  1. Broker和NameServer是否正常启动。
  2. Broker 禁止自动创建 Topic,且用户没有通过手工方式创建 Topic。这个默认是开启的。在rocketmq目录 下执行sh bin/mqbroker -m 来查看 broker 的配置参数。若autoCreateTopicEnable=true 证明是没有问题的。
  3. 看服务器控制台开没开端口号。
  4. 防火墙的设置。
  5. 配置文件有没有改。
  6. 是不是内存太小了。

参考

RocketMQ-记RocketMQ启动后producer无法连接到broker的错误及解决方案
RocketMQ4.5.1环境搭建及示例
RocketMQ 常见异常处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值