标签:
为了在Managed Bean之间进行通信,JBoss Seam 2.x和JavaEE 7 CDI都为Managed Bean提供了生成事件对象和捕获事件对象的功能。
JBoss Seam 2.x中,事件的类型是String表示。一个事件监听器可以监听多种类型的事件,任何匹配类型的事件产生都将通知事件监听器。
JavaEE 7 CDI中,事件是一个对象,其中包括一个有效负载(也是个Java对象)和一组描述符。事件监听器是方法安全的,即一个事件监听器只能监听一种具体的事件。只有事件的有效负载和描述符都匹配时,才通知对应的事件监听器。
事件与监听器的关系对比如下所示:
|
JBoss Seam 2 |
CDI 1.1 |
产生事件 |
Events.instance().raiseEvent(“foo”);
|
@Inject
private Event<Foo> event;
event.fire(new Foo());
|
监听事件 |
@Observer("foo")
public void observe() { }
|
public void observe(@Observes Foo foo) {}
|
对于事件的传播机制,JBoss Seam 2.x中,支持同步事件传播、事务中事件传播、异步事件传播和定时事件传播。JavaEE 7 CDI中,支持同步事件传播和事务中事件传播。JavaEE7 CDI不支持异步事件传播和定时事件传播,但是可以通过JavaEE的其他规范(如EJB等)实现类似功能。
对于事务中事件的传播,JBoss Seam 2.x中所有的事件对象只能在发出事件时指定的事务阶段执行。在JavaEE7 CDI中,事件对象发出时并不与事务阶段绑定,而是根据监听器方法的声明,将事件对象绑定到事务的任何阶段。即,同样的事件对象,监听器方法声明的不同,事件对象可能在不同的事务阶段执行。
事件传播对比如下所示:
事件传播模式 | Seam2?—?Raising events (observing is always same) |
CDI?1.1—?Observingevents (raising is always same) |
Synchronous | Events.instance().raiseEvent(“foo”); | publicvoid observe( @Observes Foo foo ) {} |
Transaction success phase | Events.instance().raiseTransactionSuccessEvent(“foo”); |
public void observe( @Observes ( during = TransactionPhase.AFTER_SUCCESS
)Foo foo ){ } |
Transaction completion phase | Events.instance().raiseTransactionCompletionEvent(“foo”); |
public void observe( @Observes ( during = TransactionPhase.AFTER_COMPLETION
)Foo foo ){ } |
Asynchronous |
Events.instance() .raiseAsynchronousEvent(“foo”); |
No direct alternative in CDI. Can be implemented using EJB
@Stateless public class FooObserver { @Asynchronous public void observe(@Observes Foo foo) { }} |
Timed |
Events.instance() .raiseTimedEvent(“foo”, new Schedule(1000l)); |
No direct alternative in CDI. Scheduling can be implemented using EJBTimerService orwith the help of DeltaSpike’s Schedulermodule. |
补充:JBoss Seam 2.x通过Dispatcher机制(如TimerService或QuartzScheduler),支持对Component方法的异步调用。
JavaEECDI本身不支持异步方法调用,只能依赖EJB的@Asynchronous标注的监听器方法实现异步调用。
从JBoss Seam 2.x迁移到JavaEE 7之四:事件机制
标签:
原文地址:http://blog.csdn.net/taiyangdao/article/details/51356803