2

我正在使用 Java 后端(和 SQL Server)构建一个系统,该系统允许用户创建任务并配置这些任务以在截止日期之前(如 1 天前、7 天前等)发送电子邮件提醒。

我担心的是,如果由于任何原因(计划内或计划外)发生服务中断,并且在此期间会发送中断提醒,我如何确保在系统恢复时发送那些错过的提醒?(请注意,提醒不会回复或确认。)中断可能持续 5 分钟或 5 天。而且我想确定是否有一个正在发送的提醒队列并且中间发生中断,当系统恢复时不会发送两次提醒。

我对 Java 消息服务稍微熟悉,并且有可选的持久属性以及与 JMS 的同步/异步。我可以使用 JMS 来实现这个目标吗?是否有其他现有框架可以支持我想要的东西,而无需从头开始构建。我对开源框架或实现特别感兴趣。

4

3 回答 3

2

我将首先重新构建您的要求:

  1. 构建发送电子邮件的服务
  2. 服务必须具有故障转移恢复功能,以防万一系统出现故障并重新启动,它仍应发送待处理的电子邮件提醒
  3. 您不期望对发送的消息有任何确认。

考虑到这些要求,有几种方法可以做到这一点,有许多框架和工具,其中一些可能会过度设计您的要求。这是我的建议:

  1. 使用 Java Mail API 发送电子邮件提醒
  2. 创建一个存储要发送的提醒的表,并在发送电子邮件提醒后更新一个标志
  3. 如果系统出现故障,您可以重新发送未设置标志的所有提醒。

您可以使用 JMS,但由于您只需要发送有保证的电子邮件,因此我建议您保持简单。

干杯!!

于 2013-07-26T14:03:41.407 回答
1

我会在数据库中使用一个表,我将在其中存储上次发送电子邮件提醒的时间。当系统启动时,它应该检查最后一次,将其与时间表进行比较并发送丢失的电子邮件。

于 2013-07-26T14:22:08.170 回答
0

就像对所有“use-table-in-db”答案的反驳一样。

当然,您几乎可以使用任何 JMS 服务器。例如,HornetQ。当您需要安排发送电子邮件时,将消息延迟放入队列中:

TextMessage msg = session.createTextMessage();
msg.setText(text);
msg.setStringProperty("recipient", emailTo);
msg.setLongProperty( "_HQ_SCHED_DELIVERY", System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(value, unit) );

消息将及时传递,您的异步消息处理程序可以将其发送给收件人。您可以在多个线程中处理消息,如果需要,您可以通过不同的 smtp 服务器发送电子邮件。HornetQ 很容易与 Spring 集成。

如果您为消息设置了持久性,HornetQ 会将其存储在内部数据库中,并在重启后恢复队列内容。

但。这增加了您的项目的复杂性,有时它不是很好,因此 DB 中的表可能是更好的选择。

于 2013-07-26T14:51:17.163 回答