CDI事件,它们的传播范围

时间:2011-07-26 19:36:47

标签: java session cdi

这是我经常遇到的问题,我想也许CDI事件可以帮到我,但我不确定。

我有两个用户在网站上进行交互,我希望他们共享一个bean的实例,这样他们就可以共享一个活动。到目前为止,我知道如何做到这一点的唯一方法是将数据推送到数据库,然后有两个不同的bean,每个用户一个,连续检查更改。

我的问题是,如果一个sessioncoped bean观察到一个事件,那么当我触发它时,每个用户的每个sessionbean都会得到通知吗?或者只有活动用户的会话bean?因为那时我可以使用观察者来保持两个用户同步的对象。但是我并不认为这是它的工作方式,因为如果我有一千个会话,那么一个事件会引发1000个方法调用......

我的另一个解决方案是一个巨大的应用程序范围的bean,它为两个用户保存活动对象,然后对它进行的任何更改都可以传达给用户,但是,我仍然必须扫描这个对象,我是否遗漏了某些东西?

2 个答案:

答案 0 :(得分:2)

你不会像这样免费获得它,因为当事件被触发时,当前线程只有一个会话是活动的,而实际的对象是[如果是非静态的]被调用的观察者方法来自活跃的背景。

答案 1 :(得分:1)

你可以通过拥有一个@ApplicationScoped bean来解决这个问题,所有会话都可以看到它并将其用作“缓存”。任何会话都可以触发一个事件,@ ApplicationScoped bean可以@Observe它,你可以将这个bean的引用注入你的@SessionScoped用户bean。因为@ApplicationScoped在技术上可用于所有登录用户CurrentContext,它可以从任何会话接收事件。