在Java中,假设我有一个交易,一旦提交,我想做另一个动作,在这种情况下,发送电子邮件。
因此,
try {
transaction.begin()
...
transaction.commit()
// point 1
Utility.sendEmail(...)
} catch (Exception e) {
transaction.rollback();
}
线程是否有可能在第1点死亡/被杀,而不是发送电子邮件? 有什么方法可以减少这个?也许JTA + JMS,发送消息的动作是交易的一部分? 我正在调查一个问题,并探讨这是否可行。 JVM仍然存在(没有OOM)。我不知道应用服务器的内部工作,因此不确定这是否可行。
答案 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秒,您的用户会将此视为非常长的按钮点击。