Java TransactionAttributeType.REQUIRES_NEW与@Observes结合使用(在=TransactionPhase.AFTER_成功后)

Java TransactionAttributeType.REQUIRES_NEW与@Observes结合使用(在=TransactionPhase.AFTER_成功后),java,transactions,cdi,jta,Java,Transactions,Cdi,Jta,我最近偶然发现了下一段Java EE6代码: @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void example(@Observes(during = TransactionPhase.AFTER_SUCCESS) final ExampleEvent exampleEvent) { 确实需要新的吗? 我的意思是,只有在前一个事务成功结束后(因为TransactionPhase.

我最近偶然发现了下一段Java EE6代码:

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
        public void example(@Observes(during = TransactionPhase.AFTER_SUCCESS) final ExampleEvent exampleEvent) {
确实需要新的
吗?
我的意思是,只有在前一个事务成功结束后(因为
TransactionPhase.after_SUCCESS
),才会调用示例方法


还是我遗漏了什么?

您只是在观察
ExampleEvent
,因此您的
example()
-方法本身不会被调用(基于
@TransactionAttribute
),除非您执行以下操作:

 @Inject
 private Event<ExampleEvent> exampleEvent;


 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
 public void example(@Observes(during = TransactionPhase.AFTER_SUCCESS) final ExampleEvent exampleEvent) {
    ExampleEvent event = new ExampleEvent();
    exampleEvent.fire(event);
}
@Inject
私人事件例如事件;
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
public void示例(@Observes(在=TransactionPhase.AFTER_SUCCESS)最终示例事件示例事件){
ExampleEvent事件=新的ExampleEvent();
示例事件。火灾(事件);
}

保留
@TransactionAttribute
是有意义的,因为前一个事务刚刚完成(\u SUCCESS
之后的
),因此没有当前事务,因此需要创建一个新事务。即使没有注释,这也可能自动完成(取决于AS实现),但结果应该是相同的。

还有另一个bean,其方法触发ExampleEvent。我想问的是TransactionAttributeType.REQUIRES\u NEW是否是多余的,因为新事务始终会因为(在=TransactionPhase.AFTER\u成功)而启动。正确,这就是我的意思,但是根据应用程序服务器的实现,可能有一些要求,您仍然需要声明它。如果没有
@TransactionAttribute
您可以继续使用它。