Java 通过将JBoss中实体EJB的更改通知为

Java 通过将JBoss中实体EJB的更改通知为,java,jboss,jms,Java,Jboss,Jms,我正在尝试将外部应用程序连接到JBoss AS容器。外部应用程序是一个Java应用程序,当前通过JMS主题通知数据库实体的更改。我已经向所有实体添加了EntityLifecycleListener类,这些实体将实体的序列化(和展开)副本发布到JMS主题 问题是这个实现忽略了JBoss容器的事务边界。例如,@PostUpdate事件可以触发,为该实体生成JMS消息,但事务可以回滚,从而导致外部应用程序收到无效更改的通知并变得不同步 我只需要通知我的外部应用程序成功提交到数据库,但我需要能够将整个J

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

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


我只需要通知我的外部应用程序成功提交到数据库,但我需要能够将整个JavaPOJO发布到外部应用程序。有没有一种官方的方法可以做到这一点?

JPA规范对事务划分和侦听器的定义有点模糊(§3.5.2):

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

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


我建议您尝试使用
@PreXxxxx
,它应该始终在事务中。(另外,如果我记得清楚的话,
@PreXxxx
唯一的问题是实体可能还没有被分配PK,它是否有问题取决于您的用例。)

JPA规范对事务划分和侦听器有点模糊(§3.5.2):

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

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


我建议您尝试使用
@PreXxxxx
,它应该始终在事务中。(另外,如果我记得清楚的话,
@PreXxxx
唯一的问题是实体可能还没有被分配PK,这是否有问题取决于您的用例。)

这很奇怪,我希望与JMS的交互是全局事务的一部分。我将进一步挖掘这一点……我非常确定我使用实体生命周期回调的方式是错误的,因为我使用它们将数据驱动到事务/容器边界之外,我认为根据JPA,这是不允许的。我想知道我是否应该用JBoss部署的EJB实体缓存bean注册一个侦听器,并在检查事务是否成功后使用@TransactionCompleted回调来发布对象。这很奇怪,我希望与JMS的交互是全局事务的一部分。我将进一步挖掘这一点……我非常确定我使用实体生命周期回调的方式是错误的,因为我使用它们将数据驱动到事务/容器边界之外,我认为根据JPA,这是不允许的。我想知道我是否应该改为向JBoss部署的EJB实体缓存bean注册一个侦听器,并在检查事务是否成功后使用@TransactionCompleted回调来发布对象。使用@PreXxxx不会发布过时的数据,因为它会在实体更新之前发生吗?如果事务回滚,我不会有同样的问题吗?这是我看到的一个具体案例:我调用会话Bean方法;bean从数据库加载一个实体,进行一些更改,然后执行EntityManager.flush()。这将导致触发回调侦听器的持久上下文同步。bean中的下一行抛出一个异常。这会导致事务回滚和数据不提交。但我仍然发布了我的JMS消息。@如果使用分布式事务,则不会发布。刷新同步数据并触发回调。消息已发送,但属于分布式事务。如果稍后发送失败,则不会提交任何内容(db+jms)。通过使用@PreXxxx,我不会发布过时的数据,因为它会在实体更新之前发生吗?如果事务回滚,我不会有同样的问题吗?这是我看到的一个具体案例:我调用会话Bean方法;bean从数据库加载一个实体,进行一些更改,然后执行EntityManager.flush()。这将导致触发回调侦听器的持久上下文同步。bean中的下一行抛出一个异常。这会导致事务回滚和数据不提交。但我仍然发布了我的JMS消息。@如果使用分布式事务,则不会发布。刷新同步数据并触发回调。消息已发送,但属于分布式事务。如果稍后发送失败,则不会提交任何内容(db+jms)。