我需要设计和开发一个Java应用程序,它在特定日期向用户发送电子邮件通知。 该信息存储在Oracle 11g数据库中。有一个表包含通知记录,每个记录都有一个“截止日期”。 “截止日期”只是发送通知时的日期(dd / mm / yyyy)。
可以使用电子邮件服务器发送电子邮件。
该应用程序将来需要具有可扩展性,因为它可能每天都会发送数千封电子邮件。应用程序也需要 记录是否未能发送通知,以便稍后再次重新发送通知。
Java应用程序将托管在Oracle Weblogic 10上
设计或考虑解决此问题的最佳方法是什么?
我考虑过使用JMS,但不确定我是否过度设计了这个问题(你如何应对失败的电子邮件?)。
当然,我可以编写一个简单的Java应用程序,它将读取db表,获取在该日期发送的所有通知,将它们存储在一个数组中,然后循环并开始在电子邮件中发送每个通知。感觉这种开发应用程序的方式非常原始,无法扩展。 我想接下来的事实是,解决方案应该能够处理每天发送数千封电子邮件。
答案 0 :(得分:1)
如果您希望分发通过多个进程和/或线程发送大量电子邮件的工作,那么使用JMS队列将是协调工作的一种潜在有效方式。它可以均匀地分散负载,如果多个接收器正在处理工作,它还可以提供容错功能。
但是,有些困难可能包括以下内容:
一种可能的解决方案:
让一个高效,灵活的前端流程每隔一段时间读取一次表,并确定即将到期的通知。理想情况下,数据库表将被索引和/或分区以优化此查询。仅将这些数据发布到JMS队列。队列中的消息包含对数据库行的引用。服务进程在执行通知之前检索数据库行,从而检测更改/取消。
这种方法的致命弱点是前端过程。必须付出努力以确保它始终在运行,并且本身就是容错的。此外,前端必须具有足够的吞吐量,以便在任何给定时刻处理整个负载。如果无法做到这一点,则可能需要多个前端进程。这些可以轮流(比如奇数分钟,甚至几分钟等),也可以由另一个队列自己协调。
答案 1 :(得分:0)
如果你添加一个额外的字段“EMAIL_SENT”并让电子邮件服务器处理重试,这几乎可以简单地处理。请注意,它必须是生产质量的SMTP服务器,如postfix或sendmail!
然后,您只需使用due_date<当前日期和EMAIL_SENT = false,并且对于结果集中的每个项目发送邮件(使用本地客户端,而不是连接到端口25,这对Linux来说可能是最简单的),并将EMAIL_SENT字段设置为true。下一分钟再重复一次。
您很可能会发现现代硬件很容易处理这种负载。