从JBoss Seam 2.x迁移到JavaEE 7之四:事件机制

来源:互联网 发布:java中getField 编辑:程序博客网 时间:2024/06/12 23:37

为了在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)
SynchronousEvents.instance().raiseEvent(“foo”);publicvoid observe(
@Observes
Foo foo
) {}Transaction success phaseEvents.instance().raiseTransactionSuccessEvent(“foo”);

public void observe(
@Observes
(
during = TransactionPhase.AFTER_SUCCESS
)
Foo foo
){ }Transaction completion phaseEvents.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 EJB TimerService orwith the help of DeltaSpike’s Schedulermodule.


补充:JBoss Seam 2.x通过Dispatcher机制(如TimerService或QuartzScheduler),支持对Component方法的异步调用。

JavaEECDI本身不支持异步方法调用,只能依赖EJB的@Asynchronous标注的监听器方法实现异步调用。


1 0
原创粉丝点击