本文共 1964 字,大约阅读时间需要 6 分钟。
为了在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 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 @Asynchronous annotatedmethods.
@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标注的监听器方法实现异步调用。
转载地址:http://wnlai.baihongyu.com/