通过JBoss AS中实体EJB的更改通知外部Java应用程序

时间:2010-06-05 00:13:26

标签: java jboss jms

我正在尝试将外部应用程序连接到JBoss AS容器。外部应用程序是一个Java应用程序,当前通过JMS主题通知数据库实体的更改。我已经向我的所有实体添加了一个EntityLifecycleListener类,它将实体的序列化(和解包)副本发布到JMS主题。

问题是此实现忽略了JBoss容器的事务边界。例如,@ PotostUpdate事件可能会触发,为该实体生成JMS消息,但事务可能会回滚,从而导致外部应用程序收到无效更改通知并变为未同步。

我需要外部应用程序才能通知成功提交数据库,但我需要能够将整个java POJO发布到外部应用程序。有官方的方法吗?

1 个答案:

答案 0 :(得分:1)

JPA规范对事务划分和监听器(第3.5.2节)有点模糊:

  

PreUpdate和PostUpdate回调发生在数据库更新操作之前和之后   实体数据。

我有类似的情况,到目前为止我记得,回调@PostXxxx有时在正确的交易中执行或根本没有交易。这取决于更新是事务中的“中间”刷新还是事务提交之前的“最后”刷新,在这种情况下,在提交事务之后回调发生(这是有意义的)。

我建议你试试@PreXxxxx,它应该始终在交易中。 (另外,如果我记得很清楚,@PreXxxx唯一的问题是该实体可能尚未分配PK,是否有问题取决于您的使用案例。)