2012-01-09 17 views
0

我有一个带有JPA/hibernate后端的多线程应用程序(运行在servlet容器中)。此应用程序允许通过简单的URL检索文件。在第一次下载文档(即接收到对特定URL的请求)时,应用程序应通过电子邮件发送通知消息并将文档标记为在数据库中检索到。如何确保多线程JPA应用程序中的单一操作

确保每个文档只发送一封电子邮件的正确方法是什么?由于可能多次单击检索文档的链接,因此可能会有并行事务(在不同的线程中)。这些交易只有在实施时才会看到它们各自的结果。

回答

1

由于发送邮件不是事务性的,我看到了两个可能性:

  • 使用全局事务更新retrieaval状态和SENS一个JMS消息,表明电子邮件必须发送。应该在文档实体上激活乐观并发(使用@Version字段)。这样,如果由于乐观并发检查导致事务失败,则不会发送JMS消息。当收到JMS消息时,您当然需要JMS侦听器来实际发送电子邮件
  • 使用乐观锁定并将电子邮件从事务中发出。如果由于乐观锁定导致交易失败,则不发送电子邮件。如果成功,则发送电子邮件。

或者你只是不在乎,并假设并发的首次下载将是非常特殊的。因此,您可能会收到两封电子邮件,而非一封邮件,您只需在此情况下删除多余的电子邮件即可。

相关问题