异步实现消息队列

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

**思路:典型的生产者消费者模式:**

1、在controller请求时候把相关的事情生产出来,加入到redis中

2、在消费类中运用afterPropertiesSet,applicationContext.getBeansOfType(EventHandler.class)获取指定bean中的事件handler,并构造成Map List<EventHandler>>数据结构

3、消费类中,开启新的线程,遍历构造的MapList< EventHandler>>,并遍历handler方法。



**需要关心的5个类:**



一、model(event):作为key

二、handler:事件处理的方法,比如,点赞需要发消息,messageDao.add(message)

三、producer:把model序列化,并存储到lpush到工厂中

四、consumer:

implements ApplicationContextAware,通过setApplicationContext获取applicationContext;

implements InitializingBean 通过afterPropertiesSet,构造所需要的数据结构:MapList< EventHandler>>

1、beans=applicationContext.getBeansOfType(EventHandler.class);上下获取事件处理handler

2、构造所需要的数据结构

3、开启线程,jedis中获取数据,遍历event,并执行event所有需要处理的handler方法;

五、controller客户端类,只需要调用producer,把事件加入到redis即可

你可能感兴趣的:(javaWeb)