Jakarta ee 在@SessionScoped中使用ejb计时器

Jakarta ee 在@SessionScoped中使用ejb计时器,jakarta-ee,cdi,ejb-3.1,Jakarta Ee,Cdi,Ejb 3.1,我正在写一篇论文,其中包括一个JavaEE6项目。我需要建立一个关于餐厅服务的示例项目,该服务需要在接到电话后一小时内提供食物。该项目将使用CDIAPI,尽管它可能适合BPM框架,但我只需要使用普通的JavaEE6API 我一直在考虑几个可行的选择,但唯一符合我要求的是用@SessionScoped Bean支持用户请求。然后从那里开始一个EJB计时器,它将在我们延迟一小时的交付中超时,除非用户及时交付取消它 我关心的是:@SessionScoped Bean和EJB计时器之间是否可以关联1:1

我正在写一篇论文,其中包括一个JavaEE6项目。我需要建立一个关于餐厅服务的示例项目,该服务需要在接到电话后一小时内提供食物。该项目将使用CDIAPI,尽管它可能适合BPM框架,但我只需要使用普通的JavaEE6API

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

我关心的是:@SessionScoped Bean和EJB计时器之间是否可以关联1:1关系?换句话说,EJB计时器应该只与用户关联,当计时器过期时需要通知用户。 你能建议我是否走上了正轨,或者我应该重新思考一下架构吗?
非常感谢您提出的关于1:1映射的问题,规范说明如下:

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

此外,@SessionScoped将POJO转换为CDI管理的bean,并且计时器服务是EJB特性

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

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

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

此外,@SessionScoped将POJO转换为CDI管理的bean,并且计时器服务是EJB特性

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

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

CDI使用@Observes提供这项服务,看看这个例子

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

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

或者。。您是否也可以尝试看看JMS解决方案提供了什么


希望我能理解。

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

CDI使用@Observes提供这项服务,看看这个例子

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

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

或者。。您是否也可以尝试看看JMS解决方案提供了什么

希望我能理解