ActiveMQ的延迟和定时投递

在介绍ActiveMQ的延迟和定时投递之前,这里我们先来回顾下在并发编程中介绍的堵塞队列(二)—— DelayQueue实现限时订单,其中我们就提到了一个运行场景,即网上购物下单未支付,等支付时间到了之后的处理,最简单的方式肯定就是轮询数据库了,但是轮询数据库的话肯定有很多的缺点,如造成数据库压力过大,订单会存在一定的延时情况。


然后为了避免上述的缺点,我们使用了DelayQueue实现限时订单,就很好的避免了上述最主要的两个缺点,那么使用DelayQueue就不存在缺点了么,肯定也是有的,如应用重启怎么办啊,DelayQueue中的订单信息都是存储在内存中的,如果应用重启那么内存中的数据肯定就丢失了,这里我们就必须在应用重启的时候取扫一遍数据库,将未支付已过期的订单进行处理,然后再进未支付未过期的订单再次加入DelayQueue,不过这里的过期时间需要做出相应的处理。


另外除了应用重启,还存在扩展性的问题,随着我们的业务逐渐的增大,订单系统可能会进行集群化,那么DelayQueue来处理限时订单会存在问题么,肯定也是有的,还是上述的问题,就是在集群化的情况下,如果应用重启了,每个服务读取数据库扫描一遍,这里每个服务都会把所有的订单都拉到自己的DelayQueue队列中,这样就会造成重复处理(如果是非幂等的操作就会出现问题)。


上述我们又该如何解决呢?我们就必须给每个订单加上机器码,来标注它是属于哪个服务来处理的,如ip地址等,这样服务重启时,每个服务就只去取属于自己处理的订单,但是这样的话,要是其中一台服务宕机的话,那么属于该服务的订单就不会被处理了,这里我们就需要去数据库中该服务订单的机器码进行修改,让其他服务来代替进行处理。




看完上述的过程,是不是发现存在很多的问题,并且处理还挺麻烦,最后甚至还需要去手动修改订单信息,让其他服务进行处理,这里我们能不能使用ActiveMQ来解决呢?


肯定是可以的,我们可以在ActiveMQ来启动延迟和定时投递,首先我们需要在ActiveMQ的配置文件acttivemq.xml中,进行相关的配置,在<broker>中加上schedulerSupport="true",以用来增加延迟和定时投递支持,如下:
在这里插入图片描述


然后我们在代码中发送消息的时候,就需要额外的添加一些描述消息定时调度方式的参数,如下:
在这里插入图片描述

在消息发送端只需上述即可(当然还有更多的时间调度方式),其余操作和之前一样,然后消费者也不需要进行修改,不过这里我们为了看效果,将接受时间大约出来,结果如下:
在这里插入图片描述
在这里插入图片描述


那么除了上述我们实现的延迟消息,那么还有哪几种调度方式呢,如下:

  • AMQ_SCHEDULED_DELAY: 延迟投递的时间
  • AMQ_SCHEDULED_PERIOD: 重复投递的时间间隔
  • AMQ_SCHEDULED_REPEAT: 重复投递次数
  • AMQ_SCHEDULED_CRON: Cron表达式

如上述我们只是简单的延迟5秒后进行投递,这里我们就还可以进行复杂点的设置,如我们将上述消息不仅延迟5秒,在重复发送一次,间隔时间为10秒,如下:
在这里插入图片描述
在这里插入图片描述


可能你认为上述太过于麻烦,或者有着更为复杂的调度策略,那么我们还可以使用Cron表达式来进行设置,可以设置以秒、分钟、天等单位进行循环,或者进行定时进行投递,其方式也比较简单,如下:
在这里插入图片描述

CRON和其余的也是可以一起使用的,如是上,每一分钟执行一次,会进行重发一次,然后启动后,我们还可以进入ActiveMQ的控制台进行查看,如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章