延时任务!redis key失效监听,rabbitmq死信队列实现,线程池,任务调度==>实现超时订单/默认好评/定时考试等

实现超时订单/超期默认好评等等很多常见需要用到延时任务,大概用几种做法:

  1. redis key失效监听
  2. rabbitmq死信队列
  3. 调度线程池
  4. 定时调度

一. redis key失效监听实现(推荐)


@Configuration
public class RedisKeyExpireListenerConfig {
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory factory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        container.addMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] pattern) {
                //取消订单,超期默认好评等业务
                System.out.println(String.format("body: %s, pattern: %s" ,new String(message.getBody()), new String(pattern)));
            }
        }, new PatternTopic("__keyevent@14__:expired")); //监听14库的key失效
        return container;
    }

二. rabbitmq死信队列

死信队列是rabbitmq有一个特殊属性的普通队列,spring 配置类配置好普通队列,死信队列及与各自的交换机绑定,并且普通队列配置与死信队列的绑定。业务基本流程:参考

  1. 业务消息被投入业务队列
  2. 消费者消费业务队列的消息,由于处理过程中发生异常,于是进行了nck或者reject操作(须配置手动ack)
  3. 被nck或reject的消息/超时消息由RabbitMQ投递到死信交换机中
  4. 死信交换机将消息投入相应的死信队列
  5. 死信队列的消费者消费死信消息

注意普通队列的生产者发送消息时设置超时时间: rabbitTemplate.convertAndSend("EXCHANGE", "KEY", p, 该参数设置TTL, data);

三.定时任务

如果要求延迟低而设置高频定时任务可能会导致性能问题;或频率一般,但操作的DB 表比较大也可能导致性能问题。是否通过定时任务解决需要时具体情况而定

四.调度线程池

实现最简单,但遇到宕机或重启可能丢失部分任务

 @Autowire 
 private  ScheduledThreadPoolExecutor executor;

 ...
 Future future = executor.schedule(() -> {
                    System.out.println("具体业务");
                }, 3L, TimeUnit.SECONDS);

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页