我正在编写一个消息处理应用程序(电子邮件),我想要一个传出队列。我设计这个的方式是有一个单例队列类,ThreadedQueueSender,由一个 Executor Service 和一个 BlockingQueue 支持。此外,javax.mail.Transport 对象的线程池用于获取和释放与传出 SMTP 服务器的连接。
此类公开了一个方法,add(MimeMessage)
该方法将消息添加到工作队列 ( BlockingQueue
)。
在类的实例化时,它ExecutorService
被初始化为ThreadPoolExecutor
具有固定数量的线程,比如说 5。每个线程的run()
方法都处于无限循环中,只有在检测到中断时(ExecutorService.shutdownNow()
被调用时)才退出。
此运行方法用于BlockingQueue.poll()
从工作队列中获取消息,直到没有更多可用而不阻塞,然后Transport
从连接池请求一个对象,打开连接,发送它检索到的所有消息,关闭连接并返回Transport
对象。
这行得通,但我觉得我没有通过在应用程序的生命周期内运行固定数量的线程来充分利用 ExecutorService。此外,我自己管理工作队列,而不是让并发框架处理它。其他人将如何实现此功能?将每个传入消息包装在 Runnable 中,然后执行发送逻辑是否更好?
谢谢,任何意见表示赞赏。
瑞安