我正在使用spring @Async和weblogic workmanager, Spring版本是3.2.2
Web.xml:
<resource-ref>
<res-ref-name>ReportWorkmanager</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
weblogic.xml:
<work-manager>
<name>ReportWorkmanager</name>
<fair-share-request-class>
<name>Priority</name>
<fair-share>100</fair-share>
</fair-share-request-class>
<min-threads-constraint>
<name>MinThreadCount</name>
<count>15</count>
</min-threads-constraint>
<max-threads-constraint>
<name>MaxThreadCount</name>
<count>25</count>
</max-threads-constraint>
<work-manager-shutdown-trigger>
<max-stuck-thread-time>120</max-stuck-thread-time>
<stuck-thread-count>25</stuck-thread-count>
</work-manager-shutdown-trigger>
</work-manager>
Spring配置xml:
<bean id="reportWorkManagerTaskExecutor"
class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="java:comp/env/ReportWorkmanager" />
</bean>
控制器:
@RequestMapping(value = "/publish", method = RequestMethod.POST)
public MarketingScenario publishReport(@RequestBody final PublishReportDTO reportDTO, final HttpServletRequest request) throws Exception {
reportDTO.setReqUserName(DominoWebUtil.getLoggedInUserName(request));
reportEngine.publishReport(reportDTO);
MarketingScenario scenario = scenarioService.findMarketingScenarioById(reportDTO.getScenarioId());
_LOGGER.debug("Job submitted , successfully came out for scenario id {}", reportDTO.getScenarioId());
return scenario;
}
服务:
@Async(value = "reportWorkManagerTaskExecutor")
public void publishReport(final PublishReportDTO reportDTO) {
//Some long run job
}
每当请求来自fornt end时,控制器应该通过调用service方法来启动作业,它应该在没有等待服务工作的情况下返回响应。
当@Async未应用时,一切都很顺利,但是当我申请时,服务线程因为我的请求线程已经完成而被杀死。
请告诉我,使用@Async如何创建独立于请求线程的线程。
该独立线程可能运行2分钟或20分钟取决于输入。
答案 0 :(得分:1)
首先,Spring's docs声明@Async
与默认执行者以外的@Async("otherExecutor")
应使用@Async(value="otherExecutor")
注释,而不是System.Collections.IEnumerator System.Collections.IEnumerator.GetEnumerator()
。
另外,我不认为我完全理解你的意思:
当@Async未应用时,一切都很顺利,但是当我申请时,服务线程因为我的请求线程已经完成而被杀死。
我认为你的意思是它运行正常,但是在同一个线程上。在这种情况下,由于您同步运行该方法,因此它非常有意义。