1、去RocketMQ官网下载压缩包并解压(https://rocketmq.apache.org/zh/download/),添加环境变量。
2、启动RocketMQ:
进入自己的RocketMQ安装目录下的bin目录,输入下面命令启动 nameserver:
start mqnamesrv.cmd
注:如果端口被占用,可以指定端口文件
namesrv.properties 文件里面写listenPort=9990
修改端口后启动,需要指定端口文件 start mqnamesrv.cmd -c ..\conf\namesrv.properties
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
3、验证是否启动成功
jps
4、创建RocketMQ可视化窗口 Dashboard
步骤:1、下载Dashboard(下载 | RocketMQ)
在官网中找到RocketMQ Dashboard进行下载,下载的是项目源码,可以直接在idea中运行
也可以打成Jar包运行 打包错误There are test failures.见博客There are test failures.【非常详细,已解决】-CSDN博客
Dashboard的端口默认的是8080,与springboot项目冲突,建议修改Dashboard的端口:进入代码下的src\main\resources目录,打开application.yml文件,修改port 重启Dashboard
新建Springboot项目,导入依赖
org.apache.rocketmq rocketmq-spring-boot-starter 2.2.3
在application.properties中添加RocketMQ的基本配置:
spring.application.name=rocketmq-demo #项目名 rocketmq.nameServer=127.0.0.1:9876 #端口号 rocketmq.producer.group=producer-group rocketmq.consumer.group=consumer-group
项目目录:
编写入口函数
@SpringBootApplication
创建一个 RocketMQProducer
类,用于同步发送、异步发送和单向发送。
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.example.rocketmqdemo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
@Service
public class RocketMQProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
private final String topic = "demo-topic";
// 1.同步发送消息
public void sendSyncMessage(String message){
rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build());
System.out.printf("同步发送结果: %s ", message);
}
// 2.异步发送消息
public void sendAsyncMessage(String message){
rocketMQTemplate.asyncSend(topic, MessageBuilder.withPayload(message).build(), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.printf("异步发送成功: %s ", sendResult);
}
@Override
public void onException(Throwable throwable) {
System.out.printf("异步发送失败: %s ", throwable.getMessage());
}
});
}
// 3.单向发送消息
public void sendOneWayMessage(String message){
rocketMQTemplate.sendOneWay(topic, MessageBuilder.withPayload(message).build());
System.out.println("单向消息发送成功");
}
}
编写RocketMQConsumer类
package org.example.rocketmqdemo.server;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
@Service
@RocketMQMessageListener(topic = "demo-topic", consumerGroup = "consumer-group", messageModel = MessageModel.CLUSTERING)
public class RocketMQConsumer implements RocketMQListener {
@Override
public void onMessage(String s) {
System.out.printf("收到消息: %s ", s);
}
}
编写一个简单的RocketController
控制器,用于触发消息发送:
注意修改import路径
import org.example.rocketmqdemo.server.RocketMQProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RocketController {
@Autowired
private RocketMQProducer rocketMQProducer;
@GetMapping("/sendSync")
public String sendSync(@RequestParam String message) {
rocketMQProducer.sendSyncMessage(message);
return "同步消息发送成功";
}
@GetMapping("/sendAsync")
public String sendAsync(@RequestParam String message) {
rocketMQProducer.sendAsyncMessage(message);
return "异步消息发送中";
}
@GetMapping("/sendOneWay")
public String sendOneWay(@RequestParam String message) {
rocketMQProducer.sendOneWayMessage(message);
return "单向消息发送成功";
}
}
运行项目并进行测试:
http://localhost:8080/sendSync?message=Hello123
http://localhost:8080/sendAsync?message=Hello456
http://localhost:8080/sendOneWay?message=Hello789
我的项目运行会出现如下错误:
Field rocketMQTemplate in com.xing.rocketmqdemo.service.RocketMQProducer required a bean of type 'org.apache.rocketmq.spring.core.RocketMQTemplate' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'org.apache.rocketmq.spring.core.RocketMQTemplate' in your configuration.
原因是:Springboot-3.0已经放弃了spring.plants自动装配,它被/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports所取代,添加这个文件是为了兼容
添加META-INF后,写入
org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration
即可