Transactions EJB定时器使用建议

Transactions EJB定时器使用建议,transactions,timer,ejb,scheduled-tasks,Transactions,Timer,Ejb,Scheduled Tasks,我想安排一个作业,它读取一些实体,调用一些ws,并写入/更新一些实体。此作业应在月球之后处理,例如凌晨1点。关于这个问题,我有两个问题。首先,调度器采用常量参数,我的要求是调度器应该通过一些ui进行调整。有没有合适的方法可以做到这一点?否则,我必须每30分钟调整一次调度程序,在方法中,我必须查看一些可变的时间值,无论它们是否满足。第二个问题是在调度程序方法usertransaction启动时,当我调用调用utx.start的方法时,我得到“线程已经与事务关联!”exp。我该怎么办?请推荐。提前感

我想安排一个作业,它读取一些实体,调用一些ws,并写入/更新一些实体。此作业应在月球之后处理,例如凌晨1点。关于这个问题,我有两个问题。首先,调度器采用常量参数,我的要求是调度器应该通过一些ui进行调整。有没有合适的方法可以做到这一点?否则,我必须每30分钟调整一次调度程序,在方法中,我必须查看一些可变的时间值,无论它们是否满足。第二个问题是在调度程序方法usertransaction启动时,当我调用调用utx.start的方法时,我得到“线程已经与事务关联!”exp。我该怎么办?请推荐。提前感谢。

您可以通过JMX控制台公开一个托管Bean来管理这个计时器


对于第二个问题,您似乎将事务配置为由容器管理。然后,当方法启动时,事务将自动启动。您可以禁用此自动管理,或者更好地避免编程管理,并让容器管理事务。

如果要创建可变计划表达式,则需要获取TimerService(例如@Resource TimerService\u TimerService),然后使用createCalendarTimer方法,这将调用@Timeout方法。计时器的时间表是不可变的,因此在创建新的计时器之前,UI需要使用getTimers()查找/取消现有计时器(可能通过匹配getInfo())


@超时方法继承包含bean的事务功能。如果bean使用容器管理的事务,那么UserTransaction将不起作用。

我按照您的建议解决了创建变量调度表达式的问题。另一方面,我在交易问题上还有问题。我有一个名为ModelOperations的类,它提供CRUD操作。我将这个类注入到my Timer类中,但是当我从ModelOperations调用persist方法时,我得到了“thread已经与事务关联!”。因为,我的persist方法包括utx.begin、commit等调用。在你看来,我该怎么做才能重复使用。非常感谢您的帮助。重构代码,这样您就可以调用只执行业务逻辑而不执行UserTransaction.begin/end的方法。