내 응용 프로그램에서 작업을 생성하는 복수 scheduler
스레드가 있습니다. 예를 를 들어 각 스케줄러 스레드 작업의 무리를 만들 수 있습니다다중 일정 스레드 제출 작업 RejectedExecutionException
TaskCreator tastCreator;
for (Report report: report) {
taskCreator.createTask(report);
}
:
15:57:20.107 INFO [ scheduler-4] c.task.ReportExportSchedulerTask : Task created
15:57:20.107 INFO [ scheduler-2] c.task.ReportExportSchedulerTask : Task created
을 전달하는 다음과 같이 나는 TaskCreator
구성 요소가 executeJob()
에 작업 :
@Component
public class TaskCreator {
@Autowired
private SftpTaskExecutor sftpTaskExecutor;
@Autowired
SftpConfig sftpConfig;
@Autowired
private SFTPConnectionManager connectionManager;
public void createTask(Report report) {
sftpTaskExecutor.executeJob(new JobProcessorTask(...));
}
public void validateTasksExecution() {
sftpTaskExecutor.getExecutorService().shutdown();
while (!sftpTaskExecutor.getExecutorService().isTerminated()) ;
connectionManager.disconnect();
}
}
SftpTaskExecutor
,643,executorService
이있는 I가 위의 작업을 제출 구축이 다음과 같이 두 개 이상의 스케줄러 스레드가 작업을 생성하고 동시에 서비스를 집행하기 위해 제출하는 경우
@Component
public class SftpTaskExecutor {
private ExecutorService executorService = Executors.newSingleThreadExecutor();
public void executeJob(JobProcessorTask jobProcessorTask) {
executorService.execute(jobProcessorTask);
}
public ExecutorService getExecutorService() {
return executorService;
}
}
내 질문은, 위가 RejectedExecutionException
를 throw한다 하나의 스케줄러 태스크가 완료되지 않음 (즉, 파일이 전송되지 않음)
일정 스레드마다 다른 스케줄러 스레드와 간섭하지 않고 validateTasksExecution()
을 호출 할 수 있어야합니다. 다른 말로하면 다른 스케줄러가 아직 처리 중일 때 연결을 끊지 마십시오.
여기에서 ExecutorService
을 올바르게 사용하고 있습니까? 위의 내용을 스레드로부터 안전하게 변경하려면 어떻게해야합니까? 두 개 이상의 스케줄러 스레드가 작업을 생성하고 동시에 서비스를 집행하기 위해 제출하는 경우
도움이 되었다면 답변을 수락하십시오. – Gray