我的应用程序由一套运行在 JBOSS 5.1(Java 6、Spring 3.1)中的 Web 服务组成。Web 服务代码调用 DAO 函数来更新数据库,出于性能原因,我想使该调用异步(更新对于 Web 服务响应并不重要)。我在这里有什么选择?
共识似乎是避免自己管理线程并让应用服务器来做。我在 JBOSS 5.1(Java 6、Spring 3.1)中有哪些选择?某种 JMS 解决方案?还是使用JBOSS ThreadPool?还是多边开发银行?
我的应用程序由一套运行在 JBOSS 5.1(Java 6、Spring 3.1)中的 Web 服务组成。Web 服务代码调用 DAO 函数来更新数据库,出于性能原因,我想使该调用异步(更新对于 Web 服务响应并不重要)。我在这里有什么选择?
共识似乎是避免自己管理线程并让应用服务器来做。我在 JBOSS 5.1(Java 6、Spring 3.1)中有哪些选择?某种 JMS 解决方案?还是使用JBOSS ThreadPool?还是多边开发银行?
JMS(MDB 是最简单的方法)确实有效,我建议您在使用低于 Java EE 6 的 Java EE 平台时这样做,特别是因为您立即拥有排队支持,以便在必要时能够限制执行. 此外,无论您针对的是哪个版本的 Java EE,JMS 都能继续工作。
我还滥用 EJB 计时器服务来异步调用 EJB 方法,但这很丑陋。
如果 JBoss 中不支持异步任务,您可以设置一个 spring 线程池来处理您的 DAO 调用。
例子
<bean id="myExecutioner" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="${executor.ws.poolsize}"/>
<property name="maxPoolSize" value="${executor.ws.poolsize}"/>
<property name="keepAliveSeconds" value="120"/>
<property name="threadNamePrefix" value="WsExecTask-"/>
<property name="allowCoreThreadTimeOut" value="true"/>
<property name="rejectedExecutionHandler" value="#{new java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy()}"/>
</bean>
然后在您的 web 服务中,只需连接上面定义的 Executor 并将一个包装您的 DAO 调用的 Runnable 对象传递给 execute() 方法。
如果您决定使用此解决方案,请务必阅读 ThreadPoolTaskExecutor 描述并了解拒绝处理程序部分。