用于异步任务的JMS MDB或ScheduledThreadPoolExecutor

时间:2013-02-13 19:57:30

标签: multithreading asynchronous ejb jms message-driven-bean

我一直在使用JMS Message Driven Bean一段时间,它对异步任务非常有用。我知道有很多方法可以处理异步流程,但我很好奇使用JMS Message Driven BeanScheduledThreadPoolExecutor有什么好处?

例如,我有一个Web服务,它可以异步处理某些任务。所以我看到两个主要的区别。如果我使用ScheduledThreadPoolExecutor我不需要应用程序服务器,我可以使用servlet容器,例如Tomcat,因为我没有使用任何EJB的东西,对于MDB我需要一个应用服务器,例如Glassfish的。但是在处理实际异步过程方面,每个ScheduledThreadPoolExecutorMDB有哪些优势?

1 个答案:

答案 0 :(得分:4)

ScheduledThreadPoolExecutor用于计划任务,与MDB最佳对应的抽象是ExecutorService。但回到你的问题。

MDB更重要,API更复杂,原则上它实际上是为传输数据而非逻辑而设计的。另一方面,ExecutorService是实际线程池顶部的薄层。因此,如果您需要性能,低延迟和较小的开销,请选择普通的线程池。

MDB和JMS的唯一原因是您需要持久性和事务支持。这当然会引入更大的开销,因为每条消息都需要持久化。但是,您不会丢失排队的任何任务,甚至在处理过程中也不会因崩溃而丢失。