如何确保多线程JPA应用程序中的单个操作

时间:2012-01-09 08:46:14

标签: multithreading hibernate tomcat jpa

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

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

1 个答案:

答案 0 :(得分:1)

由于发送电子邮件不是交易性的,我认为有两种可能性:

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

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