前言
承接上一篇 Springboot 整合 阿里云消息队列RabbitMQ版服务,本篇实现对于 RocketMq版消息队列服务,至于为什么不继续使用阿里云服务,懂的都懂,rocketMq版消息队列在阿里云需要付费购买,而腾讯云 rocketMq版消息队列完全免费(看过上一篇自然明白),这次我想说腾讯云真香。
准备工作
- 首先的先注册腾讯云账户,并进入首页->搜索->并选择点击。
2. 点击立即使用进入控制台
3.注意选择左侧rocketMq的菜单栏,不要选到其他队列了
4. 在右侧创建集群
5.根据官方教程 进入集群进行相关配置创建
注:所有配置都创建完成后,不难发现,接入点只有vpc接入点,公网接入点没有,看过上篇的小伙伴都应该知道,如果要进行本地测试,必须使用公网接入点才可以,我们只需要向腾讯云提交申请工单,就会免费为你开通啦(相比阿里云还需要额外收费,所以腾讯云才是真香啊)
1.
2.
3.
4.填写相关队列信息并提交(相关信息可在控制台查看)
5.提交成功后,会有相关腾讯客服打电话过来进行确认,所以务必把手机号填写正确(目前腾讯云队列只能用于测试环境,不能用于生产)
6.申请通过后,可进入集群基本信息也进行查看接入点
编码
1.创建一个 springboot项目 rocketmq-tencentcloud
2. 引入rocketmq依赖到 pom.xml文件中
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
3. 配置application.yml文件
server:
port: 8081
rocketmq:
name-server: #公网接入点
producer:
group: #分组
access-key: #密匙key
secret-key: #角色名
consumer:
access-key: #密匙key
secret-key: #角色名
# 用户自定义配置
namespace: rocketmq-jm8bmmrpooeb|xiongfeng
producer1:
topic: #队列主题名
consumer1:
group: #分组
topic: #队列主题名
subExpression: TAG1 #自定义tag
4.创建service类以及实现类
public interface RocketMqService {
String syncSend(String message, String tags);
}
@Slf4j
@Service
public class RocketMqServiceImpl implements RocketMqService{
// 需要使用topic全称,所以进行topic名称的拼接,也可以自己设置 格式:namespace全称%topic名称
@Value("${rocketmq.namespace}%${rocketmq.producer1.topic}")
private String topic;
//注入rocketmq模板对象
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Override
public String syncSend(String message, String tags) {
//获取队列主题名称
String destination = StringUtils.isBlank(tags)? topic: topic + ":" +tags;
try{
//发送同步消息
rocketMQTemplate.syncSend(destination, MessageBuilder.withPayload(message)
.setHeader(MessageConst.PROPERTY_KEYS, "miss-test").build());
}catch (Exception e){
log.error("发送消息失败", e);
}
return "消息发送成功";
}
}
5. 创建消费者监听器 实现 RocketMQListener 类
@Service
@RocketMQMessageListener(
consumerGroup = "${rocketmq.namespace}%${rocketmq.consumer1.group}", // 消费组,格式:namespace全称%group名称
topic = "${rocketmq.namespace}%${rocketmq.consumer1.topic}",// 需要使用topic全称,所以进行topic名称的拼接,也可以自己设置 格式:namespace全称%topic名称
selectorExpression = "${rocketmq.consumer1.subExpression}" // 订阅表达式, 不配置表示订阅所有消息
)
public class MessageConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("开始消费消息:" + s);
}
}
6.创建controller 类
@RestController
@RequestMapping("rocketMq")
public class RocketMqController {
@Autowired
private RocketMqService rocketMqService;
/**
* 发送消息
* @param message 消息体
* @param tags 消息标签
* @return
*/
@GetMapping("/sendMessage")
public String sendMessage(String message, String tags){
return rocketMqService.syncSend(message, tags);
}
}
7.代码结构
测试
1.成功启动项目
2.发送消息 并返回发送成功
3.查看编辑器控制台-并没有答应消费日志
4.进入腾讯云控制台查看消息- tag为我们请求是设置的 producer
5.点击查看消息轨迹--》消息被存储但并没有被消费
6.是否还记得我们在 yml文件中 配置的 消费者 tag 为 TAG1
7.再次发送消息 tag输入 TAG1
8.再次查看编辑器控制台-成功打印消费日志
9.再次进入腾讯云控制台查看-消息成功被推送