参考文章:
RocketMq灰皮书(三)------MQ使用_rocketmqtemplate.convertandsend-优快云博客
操作系统:CentOS 7.9 64位
1 rocketmq安装及配置
下载:
# 更新软件包
sudo yum update -y
# 安装jdk1.8
sudo yum install java-1.8.0-openjdk -y
#配置jdk环境变量
vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc
# 检验是否安装成功
java -version
openjdk version "1.8.0_412"
# 下载rocketmq
wget https://archive.apache.org/dist/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip
# 解压缩
mv rocketmq-all-5.3.1-bin-release.zip /opt/rocketmq
unzip rocketmq-all-5.3.1-bin-release.zip
配置:
cd /opt/rocketmq/rocketmq-all-5.3.1-bin-release/
vim conf/broker.conf
brokerIP1 = (公网ip)
namesrvAddr = 127.0.0.1:9876
autoCreateTopicEnable = true # 自动创建topic
# 配置broker启动空间大小
vim bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m" # 初始堆与最大堆大小均为512m
JAVA_OPT="${JAVA_OPT} -Xmn256m # 年轻代大小为256m
# 配置namesrv启动空间大小
vim bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
启动:
# nohup: 退出终端不会影响程序的运行。
# &:让命令在后台执行, 退出终端不再执行。
nohup sh bin/mqnamesrv &
# 此处一定要加上--enable-proxy, 否则本地无法访问到云服务上的rocketmq, 因为即便配置了brokerIP1为
公网ip, nameserver上记录的broker的ip地址仍然为私网ip,而非公网ip
nohup sh bin/mqbroker -n localhost:9876 --enable-proxy &
# 查看启动日志
cat nohup.out
The Name Server boot success. serializeType=JSON, address 0.0.0.0:9876
Sun Dec 08 21:23:11 CST 2024 rocketmq-proxy startup successfully
# 查看代理日志
cat ~/logs/rocketmqlogs/proxy.log | grep success
INFO main - The broker[broker-a, (公网ip):10911] boot success. serializeType=JSON and name server is localhost:9876
INFO main - grpc server start successfully.
INFO main - Sun Dec 08 21:23:11 CST 2024 rocketmq-proxy startup successfully
# 关闭命令(或jps 再kill进程pid):
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
2 rocketmq-dashboard安装及配置
# 下载
wget https://dist.apache.org/repos/dist/release/rocketmq/rocketmq-dashboard/2.0.0/rocketmq-dashboard-2.0.0-source-release.zip
# 解压
rm rocketmq-dashboard-2.0.0-source-release.zip /opt/rocketmq-dashboard
unzip rocketmq-dashboard-2.0.0-source-release.zip
# 需要用到maven 先下载maven(本地下载,直接上传速度更快)
# 配置环境变量
vim ~/.bashrc
export M2_HOME=/opt/maven/apache-maven-3.9.2
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
source ~/.bashrc
# 打包
mvn clean package -Dmaven.test.skip=true
# 配置阿里云安全组中端口9090(dashboard启动端口)、10909、10911、9876开放
# 配置linux防火墙9090、10909、10911、9876端口开放
# 查看防火墙状态, 未开启则开启
systemctl status firewalld
# 查看已开启端口
firewall-cmd --list-ports
# 配置
firewall-cmd --permanent --add-port=9090/tcp
firewall-cmd --reload
# 启动dashboard
java -jar /opt/rocketmq-dashboard/rocketmq-dashboard-2.0.0.jar --server.port=9090
或
nohup java -jar /opt/rocketmq-dashboard/rocketmq-dashboard-2.0.0.jar --server.port=9090 &
本地访问公网ip:9090,得到如下界面不报错:则启动成功
3 springboot整合rocketmq
配置:
# pom.xml
<!-- 添加rocketmq依赖 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
# application.yml
rocketmq:
name-server:
(公网ip):9876
producer:
group: producer-group
ProducerController.java
@RestController
public class ProducerController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@GetMapping("/producer")
public String index() {
rocketMQTemplate.convertAndSend("test-topic", "send message");
rocketMQTemplate.convertAndSend("test-topic", new User("name", 24));
return "rocketmq-producer";
}
}
@Data
class User implements Serializable {
private static final long serialVersionUID = -3486413003967431764L;
private String name;
private Integer age;
User() {}
User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
TestTopicListener.java
@Component
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "consumer")
@Slf4j
public class TestTopicListener implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println(message);
}
}
发送请求:curl -X GET "http://localhost:8080/producer"
输出:
send message
{} (有时候User类没办法显示,暂时不确定原因)
dashboard界面:
注意:此处如果本地项目没启动,查找对应的producer会报错: