【问题标题】:Using an ejb Timer in a @SessionScoped在 @SessionScoped 中使用 ejb 计时器
【发布时间】:2012-08-21 17:25:57
【问题描述】:

我正在撰写一篇包含 Java EE 6 项目的论文。我需要建立一个关于餐厅服务的示例项目,该服务需要在一小时内(从电话开始)送餐。该项目将使用 CDI Api,尽管它可能适合 BPM 框架,但我只需要使用普通的 Java EE 6 Api。

我一直在考虑几种可行的选择,但唯一符合我要求的选择是使用 @SessionScoped Bean 支持用户请求。然后从那里启动一个 EJB 计时器,它将在我们的时间超时(延迟交付),除非它被用户取消(及时交付)。

我担心的是:我可以在 @SessionScoped Bean 和 EJB Timer 之间建立 1:1 的关系吗?换句话说,EJB 计时器应该只与用户相关联,如果计时器到期则需要通知它。 如果我在一个好的轨道上或者我应该重新考虑架构,你能建议我吗? 非常感谢

【问题讨论】:

    标签: jakarta-ee cdi ejb-3.1


    【解决方案1】:

    我认为你只需要一个设计模式观察者的实现

    CDI 使用@Observes 提供这项服务,看看这个例子http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with

    使用您的客户数据触发事件,您可以调用 @asynchronous 服务在一小时后执行您的处理,以防丢失数据或发生异常尝试将您不成功的操作保留在数据库中

    @Schedule 服务可用于扫描所有不成功的操作并尝试再次进行处理

    或者 .. 您能否尝试看看 JMS 解决方案也提供了什么

    希望我确实理解..

    【讨论】:

      【解决方案2】:

      关于您关于 1:1 映射的问题,规范说明如下:

      对于自动创建的定时器,timeout方法可以是带有Schedule注解的方法。可以为无状态会话 bean、单例会话 bean、消息驱动 bean 和 2.1 实体 bean [94] 创建计时器。无法为有状态会话 bean 创建定时器[95] ...

      此外,“@SessionScoped”将您的 POJO 转换为 CDI 托管 bean,而 Timer 服务是 EJB 功能。

      但是,假设您可以访问数据库,我建议您采用以下解决方案: 一旦客户订购了东西,就在数据库中创建一个条目,包括“创建”时间戳。 配置一个调度程序/计时器,每分钟轮询此表,以验证(通过检查时间戳列)是否有任何用户需要得到通知。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2018-12-18
        • 1970-01-01
        相关资源
        最近更新 更多