定时任务
项目通常定时任务中,每天的固定时间设置可以使用 Quartz 表达式,比如每天凌晨 3 点备份数据等等。
但是一些特殊的定时任务,比如炸弹还有三分钟爆炸,你不知道什么时候触发炸弹的倒计时,有些业务没有固定触发时间等等,这个时候可以使用 RabbitMQ 结合 Spring Cloud Stream 来解决。
- 首先需要下载一个 延迟的插件rabbitmq插件rabbitmq-delayed-message-exchange
由于我的 RabbitMQ 是 3.8.9 ,所以下载的是 3.8.9
- 由于 docker 的界面只能显示有限的内容,所以我有 Xshell 连接,访问更多的目录拷贝刚刚的插件到 javaboy-rabbit 容器中
上传到 /home/myupfile 目录下
在 xshell 中找到刚刚上传的 rabbitmq 插件
运行如下命令,把插件拷贝到 javaboy-rabbit 容器的 plugins 目录下
docker cp rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez javaboy-rabbit:/plugins
进入 rabbit-mq 容器中:
docker exec -it javaboy-rabbit /bin/bash
查看 plugins 目录
查看所有插件,已启动的插件前面有E
或者 e
rabbitmq-plugins list
- 启动插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
再次查看,已启动
- 管理页面中的交换机 (exchange)中多了 x-delayed-message 选项
至此,插件安装完成 - 接下来配置 application.properties ,测试的是定时任务,先把之前配置的分组、分区的配置删除
- 然后加入开启消息延迟功能的配置,再把原来的 javaboy-topic 换成 delay-msg
#
spring.cloud.stream.rabbit.bindings.javaboy-output.producer.delayed-exchange=true
spring.cloud.stream.bindings.javaboy-input.destination=delay-msg
spring.cloud.stream.bindings.javaboy-output.destination=delay-msg
- 在发送消息时打印发送时间、消息设置延迟时间
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@Autowired
MyChannel myChannel;
@GetMapping("/hello")
public void hello(){
MessageChannel messageChannel = myChannel.output();
MessageBuilder<String> builder = MessageBuilder.withPayload("hello spring cloud stream!").setHeader("x-delay",3000);
Message<String> message = builder.build();
boolean send = messageChannel.send(message);
logger.info("" + send + new Date());
}
}
- 在收消息时打印收到时间
setHeader("x-delay",3000)
是设置延迟时间为 3 秒
@EnableBinding(MyChannel.class)
public class MsgReceiver2 {
private static final Logger logger = LoggerFactory.getLogger(MyChannel.class);
@StreamListener(MyChannel.INPUT)
public void receive(Object payload){
logger.info("received2:" + payload + ":" + new Date());
}
}
- 然后重启服务,访问 hello 接口:
查看控制台
可以看到,除了第一次用了 4 秒(可能是有初始化),其他 2 次都是 3 秒后收到,说明 RabbitMQ 、Spring Cloud Stream 联合使用使消息延迟发送配置成功,也可以叫定时任务的吧,不过感觉更应该是延迟发送