Java TransactionAttributeType.REQUIRES_NEW与@Observes结合使用(在=TransactionPhase.AFTER_成功后)
我最近偶然发现了下一段Java EE6代码: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.
@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
您可以继续使用它。