阿里云 rocketMq 延时消息
初始化消费者和生产者
- 生产者 设置rocketmq的accesskey 和secretkey 以及rocketmq的 binder server。
首先 编辑一个配置类,将关于配置rocketmq的东西写在配置类中
`
@Component
@Getter
@Setter
@Slf4j
public class RocketMqConfig {
@Value("${spring.cloud.stream.rocketmq.binder.secret-key}")
private String secretKey;
@Value("${spring.cloud.stream.rocketmq.binder.access-key}")
private String accessKey;
@Value("${spring.cloud.stream.rocketmq.binder.name-server}")
private String nameServe;
private static final String TOPIC = "delay";
private static final String GROUP_ID = "GID_live_service_update_status";
private static final String TAG = "mq_delay_tag";
private Properties properties = null;
public String getTopic() {
return TOPIC;
}
public String getTag() {
return TAG;
}
public String getGroupId() {
return GROUP_ID;
}
public Properties getProperties() {
log.info("accessKey:" + getAccessKey());
log.info("secretKey:" + getSecretKey());
log.info("naemServer:" + getNameServe());
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.GROUP_ID, GROUP_ID);
properties.setProperty(PropertyKeyConst.AccessKey, getAccessKey());
properties.setProperty(PropertyKeyConst.SecretKey, getSecretKey());
properties.put(PropertyKeyConst.NAMESRV_ADDR, getNameServe());
return properties;
}
}
- 生产者初始化
`
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.Producer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
@author
@Date 2021/11/3.
*/
@Component
@Slf4j
public class RocketMqProducerInit {@Autowired
private RocketMqConfig mqConfig;private static Producer producer;
@PostConstruct
public void init(){
log.info("启动RocketMq生产者!");
producer = ONSFactory.createProducer(mqConfig.getProperties());
// 在发送消息前,初始化调用start方法来启动Producer,只需调用一次即可,当项目关闭时,自动shutdown
producer.start();
}
/**- 初始化生产者
- @return
*/
public Producer getProducer(){
return producer;
}
}
`
`
- 编写生产者
`
import cn.hutool.core.date.DateUtil;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.exception.ONSClientException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static cn.hutool.core.convert.Convert.longToBytes;
@Component
@Slf4j
public class ProducerSendMessageHandler {
@Autowired
private RocketMqConfig config;
@Autowired
private RocketMqProducerInit producer;
public void sendGetLiveStatus(long periodId) {
Message message = new Message(config.getTopic(), config.getTag(), longToBytes(periodId));
message.setStartDeliverTime(System.currentTimeMillis() + 100000);
try {
SendResult send = this.producer.getProducer().send(message);
log.info("发送生产消息时间:"+DateUtil.now() + "发送延时消息成功! Topic is:" + config.getTopic() + "msgId is: " +
send.getMessageId());
} catch (ONSClientException e) {
e.printStackTrace();
log.error(e.getMessage());
}
}
}
`
- 监听者
`
import cn.hutool.core.date.DateUtil;
import com.aliyun.openservices.ons.api.*;
import com.dapeng.cloud.service.live.application.period.PeriodManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import static cn.hutool.core.convert.Convert.bytesToLong;
@Component
@Slf4j
public class LiveMessageStreamListener {
@Autowired
private RocketMqConfig mqConfig;
private static Consumer consumer;
@Autowired
private PeriodManager periodManager;
@PostConstruct
public void init(){
log.info("消费者启动!");
consumer = ONSFactory.createConsumer(mqConfig.getProperties());
//监听第一个topic,new对应的监听器
consumer.subscribe(mqConfig.getTopic(), mqConfig.getTag(), new MessageListener() {
@Override
public Action consume(Message message, ConsumeContext context) {
log.info("消费者接收到MQ消息时间: "+ DateUtil.now()+" -- Topic:{}, tag:{},msgId:{} , Key:{}, body:{}",
message.getTopic(), message.getTag(), message.getMsgID(), message.getKey(), bytesToLong(message.getBody()));
try {
//调用场次接口
long periodId = bytesToLong(message.getBody());
log.info("获取到 场次 id =" +periodId);
log.info("开始执行调用异常回调处理");
// 调用自己的业务代码进行操作
log.info("执行调用异常回调处理结果:"+b);
//消费成功,继续消费下一条消息
return Action.CommitMessage;
} catch (Exception e) {
log.error("消费MQ消息失败! msgId:" + message.getMsgID() + "----ExceptionMsg:" + e.getMessage());
//消费失败,告知服务器稍后再投递这条消息,继续消费其他消息
return Action.ReconsumeLater;
}
}
});
// 在发送消息前,必须调用start方法来启动consumer,只需调用一次即可,当项目关闭时,自动shutdown
consumer.start();
}
/**
* 初始化消费者
* @return consumer
*/
public Consumer getConsumer(){
return consumer;
}
}
`
阿里云 rocketMq 延时消息的更多相关文章
- RocketMQ源码 — 九、 RocketMQ延时消息
上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...
- 阿里云RocketMQ定时/延迟消息队列实现
新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...
- [原创]阿里云RocketMQ踩过的哪些坑
由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...
- 阿里云RocketMQ的生产者简单实现
// MQ的应用场景有比如 订单变更消息可以通过产生这个事件的地方(比如前端调用后端的接口post一个订单,那么就是在这个mapping方法里做一个生产者[不过最好通过aop来实现,不然n多个接口都要 ...
- 阿里云低延时直播 RTS 能力升级 让直播推流效果更佳
行业背景 直播技术飞速发展让各个行业的用户体验呈现多样化和个性化,不同业务场景下创新实践满足大众对于音视频互动体验和参与的高标准要求.历经2020年初的巨变之后,以视频.游戏.电商.教育为主的互联网经 ...
- Spring boot实战项目整合阿里云RocketMQ (非开源版)消息队列实现发送普通消息,延时消息 --附代码
一.为什么选择RocketMQ消息队列? 首先RocketMQ是阿里巴巴自研出来的,也已开源.其性能和稳定性从双11就能看出来,借用阿里的一句官方介绍:历年双 11 购物狂欢节零点千万级 TPS.万亿 ...
- rocketmq延时消息
rocketmq提供一种延时消息的解决方案,就是在特定的时间到了,消息才会被投递出去供consumer消费. 总体来是简单的场景是满足了,但是需要注意的是延时的时间是需要按照默认配置的延时级别去配置的 ...
- 阿里云RocketMQ的消费者简单实现
业务场景之类的请看另一篇生产者的实现: package com.ttt.eee; import com.aliyun.openservices.ons.api.Action; import com.a ...
- rocketmq 延时消息
rocketmq 的延时消息不能支持任意延时,她定义了18 个延时等级,并且我们可以指定这18 个延时等级的延时时间. 发送消息的时候只需在消息中指定 当前消息的 延时等级即可,并且这个延时消息不是 ...
- Docker 部署阿里云RocketMQ 4.5.1
搜索镜像 docker search rocketmq 查看镜像版本 如果要查看其它的镜像,只需要将其中的镜像名称foxiswho/rocketmq替换为其它镜像即可 curl https://reg ...
随机推荐
- Create React App 安装时出现的错误解决方法
安装很简单 创建一个文件夹 xxx 第一步:npx create-react-app my-app 第二部:cd my-app 第三部:npm start 安装时出现的错误 一 解决方案 一: 全 ...
- 区间(环形)dp
1 #include <iostream> 2 3 using namespace std; 4 5 const int MAXN=110; 6 7 int n; 8 int a[MAXN ...
- 在 Vue 项目中使用 MQTT
Vue 是一款由尤雨溪及其团队开发的渐进式 Javascript 前端框架.该框架具备数据双向绑定.组件化.响应式和轻量等特点,搭配其脚手架 Vue CLI 使得开发者更加容易上手,大大减少了学习成本 ...
- vscode 终端中运行执行js文件
问题汇总 1.在vscode中执行node -v没有反应或者执行js文件出现下图错误 解决办法: 1.先关闭vscode,找到vscode的执行文件,在兼容性中勾上以管理员身份运行此程序,该问题win ...
- websocket状态码
状态码 描述 0–999 保留段, 未使用 1000 正常关闭; 无论为何目的而创建, 该链接都已成功完成任务. 1001 终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开 ...
- Golang-Study
Golang-Study-Note 参考教程视频:狂神说 https://www.bilibili.com/video/BV1ae41157o9?p=1&vd_source=793668372 ...
- vscode远程连接服务器出现Bad owner or permissions on .ssh/config
vscode远程连接服务器出现Bad owner or permissions on C:\\Users\USER\.ssh/config 过程试图写入的管道不存在, 原因是vscode的remoto ...
- windows下的故障自愈程序,可以实现进程,kafka按时间段判断状态,日志分级
self-healing 1.使用python3.11写的一个故障自愈程序. 2.本程序在window2019 server运行测试通过 3.通过监控java程序里的详细启动包名来判断进程是否存在 4 ...
- python multiprocessing多进程 cannot pickle '_io.TextIOWrapper' object
Python 3.9.6 在windows下使用multiprocessing多进程报如下错误,但linux下正常 Traceback (most recent call last): File &q ...
- 蓝桥杯训练赛二-问题 B
字符串的输入输出处理. 输入 第一行是一个正整数N,最大为100.之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000. 输出 先将输入中的前N行字符串(可能含有空格)原样 ...