从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 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之四:事件机制
- 从JBoss Seam 2.x迁移到JavaEE 7之二:组件的有效范围Scope
- 从JBoss Seam 2.x迁移到JavaEE 7之三:对象的注入
- 从JBoss Seam 2.x迁移到JavaEE 7之一:组件模型
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- 从Python & Zope到Java with EJB 3 & JBoss SEAM
- matlab中struct为空判断
- mysql主从复制
- CentOS7 安装 Java 8 以及Tomcat8
- leetcode算法训练#1 Two Sum
- system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权
- 从JBoss Seam 2.x迁移到JavaEE 7之四:事件机制
- WebSettings理想的设置方式
- Windows 中为git添加ssh认证
- 最长上升子序列
- 搭建Maven私服
- 在android中用eventBus.2.4.jar中出现的问题
- 第14th广东省赛总结
- 回溯法实现格雷码
- Java数组操作