3

让 bean 使用 CDI bean(使用 Myfaces CODI)代替 JSF 托管 bean 一段时间以来,我一直在阅读一些教程,以更好地理解我可以用这项技术真正做些什么。最明显的利用潜力是 CDI 事件模型,但我对我可以使用它的用途没有太多灵感。

我有一个页面计数器机制,它可以在不访问关键路径上的数据库的情况下维护页面访问的持久记录,即减慢页面加载时间。这通过增加 AtomicReference 访问的 ConcurrentHashMap 中的 AtomicInteger 来工作,数据存储在单例 EJB 中。然后一个 EJB 计时器周期性地“抓取”地图,用一个新的替换它,并将新的命中添加到适当的数据库记录中。PreDestroy 侦听器在应用服务器关闭时保存所有非持久更新。

我认为在页面加载时,我可以使用应用程序范围的 CDI bean 来触发“页面访问”事件并观察它并进行后端处理,但这在某些方面不符合现有设计:

  • 目前更新是批量更新的,timer 方法每隔几分钟运行一次。

  • 虽然现有设计在服务器电源故障时会丢失数据,但这是不可取的,但可以接受,但它相当可靠,因为它可以处理正常关闭。

我需要更好地了解在服务器关闭时排队的 CDI 事件会发生什么,我将通过规范来解决这个问题。

虽然我很感谢对上述想法的任何反馈,但我真正感兴趣的是受到您在 JSF 应用程序中使用 CDI 事件的任何有趣场景的启发,有人愿意分享他们的经验吗?

谢谢。

4

2 回答 2

3

您可以在 jsf 应用程序的以下用例中使用 CDI 事件:

  • 当用户想要登录/注销时触发/观察事件
  • 用户更改区域设置时触发/观察事件
  • 用户更改主题时触发/观察事件
  • 等等

对于您的用例,您可以使用 @Asynchronous 注释负责存储页面视图统计信息的 EJB,以便在另一个线程中执行此操作。那么我认为您的页面加载速度不会减慢。

通常,当您想使用旧的事件/观察者模式时,您可以使用 CDI 事件,但要以解耦和优雅的方式加上 DI 功能。这种模式可以应用于各种各样的用例。

欲了解更多信息,请阅读此博客。链接1 链接 2

于 2012-08-24T11:15:12.607 回答
1

首先,事件是同步的,而不是异步的。这意味着您显然不能像 JMS 那样使用它们,而且如果服务器停止,也没有什么能比得上故障转移。

事实上,唯一的原因——我知道——为什么引入事件机制是为了以类型安全的方式解耦组件(但这是一个很好的理由:)

我遇到的最优雅的场景之一是 Seam Catch(现在模制成Seam Solder)。在此处查看说明。事件驱动的异常处理的想法是允许不同的参与者(又名:CDI 模块和用户代码)注册自己以获取异常通知。然后事件在注册的观察者链中上下冒泡,并将使用固有的 CDI 机制自动找到最合适的处理程序。

最好自己阅读文档/查看源代码。

于 2012-08-23T15:40:55.153 回答