一、Spring配置
實際項目簡單配置
<bean
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="1000" />
</bean>
較完整參考
<!-- 異步線程池 -->
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心線程數 -->
<property name="corePoolSize" value="3" />
<!-- 最大線程數 -->
<property name="maxPoolSize" value="20" />
<!-- 隊列最大長度 >=mainExecutor.maxSize -->
<property name="queueCapacity" value="1000" />
<!-- 線程池維護線程所允許的空閒時間 -->
<property name="keepAliveSeconds" value="300" />
<!-- 線程池對拒絕任務(無線程可用)的處理策略 -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean>
二、Service中注入
@Autowired
protected ThreadPoolTaskExecutor taskExecutor;
三、service中方法使用
項目中用來異步記log
public void doSomething(){
threadPool.execute(new Runnable() {
@Override
public void run() {
//異步執行耗時的業務任務
}
});
}
@Transactional
public void logBomInfo(final int loggingKey, final String appId,
final Object bom) {
try {
taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
LogBomInfo logBomInfo = new LogBomInfo();
logBomInfo.setBomInfoId(loggingKey);
logBomInfo.setAppId(appId);
logBomInfo.setBom(jsonMapper.writeValueAsString(bom));
logBomInfo.setBizkey(getBomBizKey(bom));
logBomInfoDAO.insertLogBomInfo(logBomInfo);
if (logger.isDebugEnabled()) {
logger.debug("保存日誌成功, bomInfoId:" + loggingKey);
}
} catch (Exception ex) {
logger.error("保存日誌發生錯誤", ex);
}
}
});
} catch (Exception ex) {
logger.error("寫入日誌表失敗", ex);
}
}