我需要在调用EJB方法后异步执行一些东西。这种需求似乎是在EJB 3.1中实现的,但不幸的是,我们还没有实现,只能使用3.0版本。EJB和异步处理
作为最简单的方法,您会有什么建议,并且有注意事项?我能想到以下方法:
- JMS(可能矫枉过正)
- TimerService(看起来很简单)
- 春天的TaskExecutor(这是如何配置的)
这需要工作,一个Weblogic服务器。不会有任何巨大的负载或大规模并行处理,我只是希望它很好,很简单。
我需要在调用EJB方法后异步执行一些东西。这种需求似乎是在EJB 3.1中实现的,但不幸的是,我们还没有实现,只能使用3.0版本。EJB和异步处理
作为最简单的方法,您会有什么建议,并且有注意事项?我能想到以下方法:
这需要工作,一个Weblogic服务器。不会有任何巨大的负载或大规模并行处理,我只是希望它很好,很简单。
您必须先决定是否要异步事务处理。也就是说,如果常规EJB方法事务失败,异步事件是否仍然被触发。
JMS和TimerService
是事务性的。春天TaskExecutor
,可能不是(我应该仔细检查一下)。
使用Timer
您可以延迟事件的执行(即使为0),以便在EJB方法返回后,异步事件立即在后台运行。如果异步事件失败,计时器服务会尝试重新运行几次。
使用JMS,您无法严格控制何时处理该事件。一旦消息被发送,你就知道它会最终被处理,但是代理理论上可以推迟它的处理来管理负载。
我不知道您的具体使用情况,但使用TimerService
似乎非常适合,如果负载不是问题,再加上它很容易使用。
WorkManager专为此目的而设计,并由WebSphere和WebLogic本地支持。其他应用程序服务器也有其他实现。
它被设计用来执行异步工作,同时仍然允许服务器管理线程。
可以试试看,Spring似乎还有一个TaskExecutor实现。我现在不介意可移植性。 – yedd 2010-06-10 06:06:19
TimerService似乎是最简单的,但是从我读的内容来看,它并没有对准确性给出太多的保证,我希望尽可能立即启动该过程。 – yedd 2010-06-10 06:01:31
@yedd根据我在Glassfish中的经验,您可以为过期定时器的轮询和重新发送间隔配置几个值http://docs.sun.com/app/docs/doc/820-7695/beahw?l=en&n = 1&一个=图。我们用1秒的精度对它进行了配置,并且这个工作正常。我猜在weblogic中有类似的东西。您可以尝试缩短间隔时间,以使其对您而言变得足够“直接”。 – ewernli 2010-06-10 08:00:29