面试题答案
一键面试-
思路:利用消息队列本身特性或结合外部工具来达成定时发送消息效果。对于支持延迟队列特性的消息队列(如RabbitMQ借助插件实现延迟队列),可直接设定消息延迟时间;若消息队列不直接支持,可结合定时任务框架(如Quartz),在定时任务触发时往消息队列发送消息。
-
以RabbitMQ借助延迟队列插件实现定时发送消息为例,大致步骤如下:
- 安装延迟队列插件:在RabbitMQ环境中安装并启用延迟队列相关插件,如
rabbitmq_delayed_message_exchange
插件。 - 创建交换机和队列:
- 创建一个类型为
x-delayed-message
的交换机,例如命名为delayed_exchange
。 - 创建一个普通队列,比如命名为
task_queue
,并将其与上述交换机通过合适的路由键绑定。
- 创建一个类型为
- 发送定时消息:
- 在生产者端,构建消息并设置消息的延迟属性,指定消息延迟多久后投递到队列。例如,设置延迟时间为
30000
毫秒(30秒)。 - 将消息发送到
delayed_exchange
交换机,由交换机按照延迟时间将消息投递到task_queue
队列。
- 在生产者端,构建消息并设置消息的延迟属性,指定消息延迟多久后投递到队列。例如,设置延迟时间为
- 消费消息:消费者监听
task_queue
队列,当消息到达队列后,消费者即可获取并处理该定时任务消息。
- 安装延迟队列插件:在RabbitMQ环境中安装并启用延迟队列相关插件,如
-
以结合Quartz框架和Kafka为例,大致步骤如下:
- 引入依赖:在项目中引入Quartz和Kafka相关依赖,确保项目能使用两者功能。
- 配置Quartz:
- 定义Job类,在Job类的
execute
方法中编写向Kafka发送消息的逻辑。 - 配置调度器,设定定时任务的触发时间规则,比如每天凌晨2点执行任务。
- 定义Job类,在Job类的
- 配置Kafka:
- 配置Kafka生产者,设置好Kafka服务器地址、序列化方式等参数。
- 在Quartz的Job类中,通过Kafka生产者将消息发送到指定的Kafka主题。
- 启动任务:启动应用程序,Quartz调度器按照设定的时间触发任务,往Kafka发送定时消息,Kafka消费者监听主题获取并处理消息。