【问题标题】:Messaging Architecture消息架构
【发布时间】:2013-07-26 13:48:10
【问题描述】:

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

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

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

【问题讨论】:

  • 我做了与您的请求类似的事情,使用一个表格来存储所有要发送的电子邮件,SEND_STATUS 和一个 Java 作业来实际完成这项工作。也许可以满足您的需求。

标签: java messaging


【解决方案1】:

我将首先重新定义您的要求:

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

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

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

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

干杯!!

【讨论】:

  • 谢谢。这很有帮助,很可能是我们将采取的方法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    就像对所有“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 中的表可能是更好的选择。

    【讨论】:

    • 我认为我们将使用 DB 方法,但这个方法也很有趣。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 2010-10-17
    • 2021-09-21
    • 2010-11-18
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多