2

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

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

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

4

2 回答 2

2

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

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

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

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

于 2012-11-18T11:36:20.840 回答
2

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

CDI 通过使用 @Observes 提供此服务,请查看此示例http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with

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

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

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

希望我明白了..

于 2013-05-03T05:42:23.400 回答