0

我需要设计和开发一个在特定日期向用户发送电子邮件通知的 Java 应用程序。信息存储在 Oracle 11g 数据库中。有一个包含通知记录的表,每条记录都有一个“截止日期”。“到期日”只是应该发送通知的日期(日/月/年)。

电子邮件服务器将可用于发送电子邮件。

该应用程序将来需要可扩展,因为它可能每天发送数千封电子邮件。如果通知发送失败,应用程序还需要记录,以便稍后重试发送。

Java 应用程序将托管在 Oracle Weblogic 10 上

设计或考虑解决此问题的最佳方法是什么?

我考虑过使用 JMS,但不确定我是否过度设计了问题(您如何处理失败的电子邮件?)。

当然,我可以编写一个简单的 Java 应用程序来读取 db 表,获取在该日期发送的所有通知,将它们存储在一个数组中,然后循环并开始在电子邮件中发送每个通知。感觉这种开发应用程序的方式非常原始,无法扩展。我想关键在于该解决方案应该能够处理每天可能发送的数千封电子邮件。

4

2 回答 2

1

如果您希望在多个进程和/或线程上分配发送大量电子邮件的工作,那么使用 JMS 队列将是协调工作的一种潜在有效方式。如果多个接收器正在处理工作,它会平均分配负载,并且还可以提供容错。

但是,一些困难可能包括以下内容:

  • JMS 消息接收一般不保证是有序的。用于稍后时间的通知可能会在较早的通知之前传递。
  • 保持数据库表和队列之间的协调可能很困难。对表的每次插入/更新/删除也可能需要将消息发布到队列中。
  • 一次将所有未来的请求发布到队列中可能是不可取的。
  • 可能需要一种机制来将取消的请求传播到队列。

一种可能的解决方案:

让一个高效、灵活的前端进程每隔一段时间读取该表,并确定哪些通知即将到期。理想情况下,数据库表将被索引和/或分区以优化此查询。只有这些数据发布到 JMS 队列。队列中的消息包含对数据库行的引用。服务进程在执行通知之前检索数据库行,从而检测更改/取消。

这种方法的致命弱点是前端流程。必须努力确保它始终运行并且本身具有容错性。此外,前端必须有足够的吞吐量来处理任何给定时刻的整个负载。如果这不可能,则可能需要多个前端进程。这些可以轮流进行(例如,奇数分钟、偶数分钟等),也可以由另一个队列自行协调。

于 2013-05-27T23:36:24.493 回答
0

如果您添加一个额外的字段“EMAIL_SENT”并让电子邮件服务器处理重试,这几乎可以非常简单地处理。请注意,它必须是生产质量的 SMTP 服务器,例如 postfix 或 sendmail!

然后,您只需使用 due_date < 当前日期和 EMAIL_SENT=false 进行选择,并为结果集中的每个项目发送邮件(使用本地客户端,而不是连接到端口 25,这对于 Linux 可能最简单) ,并将 EMAIL_SENT 字段设置为 true。下一分钟再重复一次。

您很可能会发现现代硬件可以轻松处理这种负载。

于 2013-05-27T23:44:11.967 回答