提交事务然后发送电子邮件

时间:2011-06-08 04:53:42

标签: email transactions commit

在Java中,假设我有一个交易,一旦提交,我想做另一个动作,在这种情况下,发送电子邮件。

因此,

try {
    transaction.begin()
    ...
    transaction.commit()
    // point 1
    Utility.sendEmail(...)
} catch (Exception e) {
    transaction.rollback();
}

线程是否有可能在第1点死亡/被杀,而不是发送电子邮件? 有什么方法可以减少这个?也许JTA + JMS,发送消息的动作是交易的一部分? 我正在调查一个问题,并探讨这是否可行。 JVM仍然存在(没有OOM)。我不知道应用服务器的内部工作,因此不确定这是否可行。

1 个答案:

答案 0 :(得分:1)

如果commit()没有问题并且sendEmail()引发异常,我无法确定catch子句中的rollback()是否有任何影响。测试此方法的最快方法是从sendEmail()方法抛出异常,并查看事务是否已实际提交。

我想说的方法是将sendEmail()调用从try块移开:

try {
    transaction.begin()
    ...
    transaction.commit()
} catch (Exception e) {
    transaction.rollback();
}

try {
    // point 1
    Utility.sendEmail(...)
} catch (Exception e) {
    // handle it
}

通过这种方式,您可以控制在进行回滚时会发生什么。

另外,我认为将电子邮件发送到JMS队列在大多数情况下都是个好主意。这样做将使您的数据库代码有权继续,并且应该向您的用户提供反馈,确保一切正常,并且只要符合电子邮件控制器的计划,就会发送电子邮件。例如,您的电子邮件服务器可能存在连接问题,并且在发送异常之前,电子邮件发送会挂起30秒,您的用户会将此视为非常长的按钮点击。