我正在撰写一篇包含Java EE 6项目的论文。我需要建立一个关于餐馆服务的示例项目,该服务需要在一小时内(从通话中)提供食物。该项目将使用CDI Api,虽然它可能适合BPM框架,但我需要使用普通的Java EE 6 Api。
我一直在考虑几个可行的选择,但唯一符合我要求的是使用@SessionScoped Bean支持User请求。然后从那里开始一个EJB计时器,它将在我们的小时(延迟交付)超时,除非它被用户取消(及时交付)。
我担心的是:我可以将@SessionScoped Bean和EJB Timer之间的1:1关系关联起来吗?换句话说,EJB计时器应该只与User关联,需要通知的是计时器到期。 如果我处于良好的轨道上,或者我应该重新思考架构,你能建议我吗? 非常感谢
答案 0 :(得分:2)
关于1:1映射的问题,规范说明如下:
对于自动创建的计时器,timeout方法可以是使用Schedule注释注释的方法。可以为无状态会话bean,单例会话bean,消息驱动bean和2.1实体bean [94]创建计时器。无法为有状态会话bean [95] ...
创建计时器
此外,“@ SessionScoped”将您的POJO转换为CDI托管bean,而Timer服务是EJB功能。
但是,假设您有权访问数据库,我建议您使用以下解决方案: 一旦客户订购了某些东西,就在数据库中创建一个条目,包括一个“创建的”时间戳。 配置一个调度程序/计时器,每分钟轮询一次该表,以验证(通过检查时间戳列)是否有任何用户需要获得通知。
答案 1 :(得分:2)
我认为你只需要设计模式Observer的实现
CDI使用@Observes提供此服务,请查看此示例http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with
使用您的客户数据触发事件,您可以调用@asynchronous服务,该服务在一小时后进行处理,以防丢失数据或发生异常,尝试在数据库中保留不成功的操作
@Schedule服务可用于扫描所有不成功的操作并尝试再次进行处理
或者..你可以尝试看看JMS解决方案提供的内容吗
希望我明白了..