Spring非同期スレッドプール、タスクスレッドプール構成のスケジュール
3712 ワード
1つのプロジェクトには非同期タスクも必要であり、タスクをスケジューリングする必要があります.この2つの非同期スレッドプールを分割するには、2つのスレッドプールを構成する必要があります.スケジュールタスク@Scheduled注記を追加します.非同期で実行する方法で@Async注記を追加する必要があります.
会社はslf 4 jのMDCを利用してリンク追跡を行うので、前置き操作を追加し、TaskDecoratorを使用して実現する必要があります.
もう一度みんなに分かち合って忘れさせます.
コードは次のとおりです.
AsyncConfig.java
SchedulingConfig.java
会社はslf 4 jのMDCを利用してリンク追跡を行うので、前置き操作を追加し、TaskDecoratorを使用して実現する必要があります.
もう一度みんなに分かち合って忘れさせます.
コードは次のとおりです.
AsyncConfig.java
package com.ecej.esmart.autodispatch.config;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskDecorator;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.Map;
import java.util.concurrent.Executor;
@Slf4j
@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Bean
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("async-pool-");
executor.setTaskDecorator(new MdcTaskDecorator());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
return executor;
}
class MdcTaskDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) {
Map contextMap = MDC.getCopyOfContextMap();
try {
if (contextMap != null) {
MDC.setContextMap(contextMap);
}
runnable.run();
} finally {
/** , , */
//MDC.clear();
}
return runnable;
}
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (throwable, method, params) -> {
log.error(" : :{} :{}", method.getName(), JSON.toJSONString(params));
log.error(throwable.getMessage(), throwable);
};
}
}
SchedulingConfig.java
package com.ecej.esmart.autodispatch.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@Slf4j
@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
@Bean(destroyMethod = "shutdown")
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("dispatch-");
scheduler.setAwaitTerminationSeconds(600);
scheduler.setErrorHandler(throwable -> log.error(" ", throwable));
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
}