博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从JBoss Seam 2.x迁移到JavaEE 7之四:事件机制
阅读量:4178 次
发布时间:2019-05-26

本文共 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;
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 EJB TimerService orwith the help of DeltaSpike’s Schedulermodule.

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

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

转载地址:http://wnlai.baihongyu.com/

你可能感兴趣的文章
商务智能-基本方法-数据钻取
查看>>
C++程序员技术需求规划(发展方向)
查看>>
JNI
查看>>
Android 短信模块分析(七) MMS数据库定义及结构整理
查看>>
Android 短信模块分析(八) MMS数据库表关系
查看>>
Android 图标上面添加提醒(二)使用开源UI类库 Viewbadger
查看>>
Android 图标上面添加提醒(一)使用Canvas绘制
查看>>
Android WebView加载Html右边空白问题的解决方案
查看>>
Android 仿网易新闻v3.5:上下滑动的引导页
查看>>
Android 天气预报图文字幕垂直滚动效果
查看>>
Android硬件加速
查看>>
智慧平安社区系统开发解决方案,智慧小区大数据分析平台建设
查看>>
NQI国家质量技术基础系统开发,国家质量基础设施平台建设
查看>>
nc命令用法举例
查看>>
Linux vmstat命令详解
查看>>
linux watch命令
查看>>
Linux lsof命令详解
查看>>
C/C++中字符串操作函数strcpy,strcat,strlen等
查看>>
贝壳找房机试题(笔试题)
查看>>
Xerces的下载,编译和在VS 2019中的配置
查看>>