1

我的应用程序由一套运行在 JBOSS 5.1(Java 6、Spring 3.1)中的 Web 服务组成。Web 服务代码调用 DAO 函数来更新数据库,出于性能原因,我想使该调用异步(更新对于 Web 服务响应并不重要)。我在这里有什么选择?

共识似乎是避免自己管理线程并让应用服务器来做。我在 JBOSS 5.1(Java 6、Spring 3.1)中有哪些选择?某种 JMS 解决方案?还是使用JBOSS ThreadPool?还是多边开发银行?

4

2 回答 2

3

JMS(MDB 是最简单的方法)确实有效,我建议您在使用低于 Java EE 6 的 Java EE 平台时这样做,特别是因为您立即拥有排队支持,以便在必要时能够限制执行. 此外,无论您针对的是哪个版本的 Java EE,JMS 都能继续工作。

我还滥用 EJB 计时器服务来异步调用 EJB 方法,但这很丑陋。

于 2012-11-26T12:42:01.823 回答
0

如果 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() 方法。

如果您决定使用此解决方案,请务必阅读 ThreadPoolTask​​Executor 描述并了解拒绝处理程序部分。

于 2012-11-26T12:22:28.387 回答