异步实现消息队列

来源:互联网 发布:seo编辑 编辑:程序博客网 时间:2024/04/30 17:06

为什么要使用队列,什么情况下才会使用队列?
那些实时性要求不高,且比较耗时的任务,是队列的最佳应用场景。比如说我在某网站注册一个账号,当我的信息入库注册成功后,网站需要发送一封激活邮件,让我激活账号,而这个发邮件的操作并不是需要实时响应的,没有必要卡在那个注册界面,等待邮件发送成功,再说发送邮件本来就是一个耗时的操作(需要调用第三方smtp服务器),此时,选择消息队列去处理。
就拿实际的点赞来说吧,用户的点赞请求到来,我只是将点赞请求投递到消息队列里面,后续的点赞请求可以将消息合并,即只更新点赞数,不产生新的任务。

**思路:典型的生产者消费者模式:**1、在controller请求时候把相关的事情生产出来,加入到redis中2、在消费类中运用afterPropertiesSet,applicationContext.getBeansOfType(EventHandler.class)获取指定bean中的事件handler,并构造成Map <EventType,List<EventHandler>>数据结构3、消费类中,开启新的线程,遍历构造的Map<EventType,List< EventHandler>>,并遍历handler方法。**需要关心的5个类:**一、model(event):作为key二、handler:事件处理的方法,比如,点赞需要发消息,messageDao.add(message)三、producer:把model序列化,并存储到lpush到工厂中四、consumer:implements ApplicationContextAware,通过setApplicationContext获取applicationContext;implements InitializingBean 通过afterPropertiesSet,构造所需要的数据结构:Map<EventType,List< EventHandler>>1、beans=applicationContext.getBeansOfType(EventHandler.class);上下获取事件处理handler2、构造所需要的数据结构3、开启线程,jedis中获取数据,遍历event,并执行event所有需要处理的handler方法;五、controller客户端类,只需要调用producer,把事件加入到redis即可
0 0
原创粉丝点击