生产者消费者模式的一次实际应用

来源:互联网 发布:mac怎么做苹果铃声 编辑:程序博客网 时间:2024/05/16 08:31

现在有这样一个需求:网站有很多合作站点,要求每天定时向合作站点负责人发送邮件通知该站点每日的引流情况;向运营发送网站各方面整体的观测数据.

1. 流程分析

  1. 引流数据.可以通过百度统计的接口来获取.
  2. 邮件发送.

这2步中间还穿插着数据的处理与邮件的应用等,不过这不是该文的重点.目前我们已经拥有邮件数据.(在邮件数据里已经包含邮件的全部信息,包括收件人等).重点是如何快速发送所有邮件.

首先可以抽象一下,无论是给各合作站点负责人发送邮件,还是给网站运营发送邮件,都是发送邮件.由于邮件中含有包括收件人在内的所有信息,因此我们在进行邮件分发的时候,不必考虑邮件内容是如何构造出来的.只关心邮件发送这一个过程.

2.生产者与消费者模式的实践.

邮件内容入队列,多个线程作为消费者取数据,这是基本做法.

考虑作为服务对外暴露的方法分为两个过程:
1.构收集数据并且数据入队列.
该过程,两种分发是不同的,因为后台数据的不同,导致后台构造邮件内容的过程也不近相同,因此给运营发邮件和给引流方发邮件是不同的过程.

以给运营发邮件为例:

createEmail();

这样就把队列填充完毕.

  1. 分发邮件
    该过程与接收方无关.只需要线程取数据即可,因此属于一个方法.
distributeEmailMethod();

在createEmail()方法中使用queue.offer(data)填充队列,在distributeEmailMethod()方法中使用queue.poll取数据.需要注意,取出数据后要新起一个线程,因此要给该线程提交一个任务.该任务要继承thread类或者实现runnalbe接口,可以把任务包装在一个内部类里面,在内部类里的run()中添加数据处理逻辑.

参考方腾飞的文章.

原创粉丝点击