gpt4 book ai didi

Java 电子邮件发送队列 - 固定数量的线程发送尽可能多的可用消息

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:08 24 4
gpt4 key购买 nike

我正在编写一个消息处理应用程序(电子邮件),我想要一个传出队列。我设计这个的方式是有一个单例队列类,ThreadedQueueSender,由一个 Executor Service 和一个 BlockingQueue 支持。此外,javax.mail.Transport 对象的线程池用于获取和释放与传出 SMTP 服务器的连接。

此类公开了一个方法,add(MimeMessage),用于将消息添加到工作队列 (BlockingQueue)。

在类的实例化时,ExecutorService 被初始化为一个具有固定数量线程的 ThreadPoolExecutor,比如说 5 个。每个线程的 run() 方法处于无限循环中,仅在检测到中断时退出(当调用 ExecutorService.shutdownNow() 时)。

此运行方法使用 BlockingQueue.poll() 从工作队列中获取消息,直到没有更多消息可用而不阻塞,然后从连接池中请求一个 Transport 对象, 打开连接,发送它检索到的所有消息,关闭连接并返回 Transport 对象。

这行得通,但我觉得我没有充分利用 ExecutorService,因为在应用程序的生命周期中运行固定数量的线程。此外,我自己管理工作队列,而不是让并发框架处理它。其他人将如何实现此功能?将每个传入消息包装在一个 Runnable 中,然后执行发送逻辑是否更好?

谢谢,如有任何意见,我们将不胜感激。

瑞安

最佳答案

您应该为执行程序服务应完成的每项工作创建任务。

例如,您可以创建一个可调用的“MailSendingTask”,它包含 MimeMessage 并包装邮件发送。通过将这些 MailSendingTasks 提交给你的执行者来排队。现在你的 Executor 决定将创建多少线程(通过设置线程池上下限来配置它)

你只需要创建 2 或 3 个类/接口(interface)

  • 一个提供简单 send(MimeMessage msg) 方法的 MailService 接口(interface)
  • 一个 MailServiceImplementation 类,它实现 MailService 并保存对已配置执行程序的引用
  • 一个实现可调用接口(interface)的 MailSenderTask 类,该接口(interface)持有对 MimeMessage 对象的引用并执行邮件发送。

您甚至可以更进一步,创建一个额外的服务来管理 MailSenderTask 可以使用的邮件套接字连接。

如果你想添加“取消”,你应该看看类 Future 和 FutureTask

关于Java 电子邮件发送队列 - 固定数量的线程发送尽可能多的可用消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1488555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com