私のアプリケーションでは、タスクを作成する複数の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
Component
に私は上記のタスクを提出するexecutorService
を構築することを次のように二つ以上のスケジューラスレッドがタスクを作成し、同時にサービスをエグゼキュータに提出されているが、上記RejectedExecutionException
をスローした場合私の質問は、ある
@Component
public class SftpTaskExecutor {
private ExecutorService executorService = Executors.newSingleThreadExecutor();
public void executeJob(JobProcessorTask jobProcessorTask) {
executorService.execute(jobProcessorTask);
}
public ExecutorService getExecutorService() {
return executorService;
}
}
1つのスケジューラタスクが完了していない(すなわち各スケジュールスレッドの場合は送信されません)
ファイル、私は他のスケジューラ・スレッドに干渉することなくvalidateTasksExecution()
を呼び出すことができるようにする必要があります。言い換えれば、他のスケジューラがまだ処理していない間に切断しないでください。
私はこれに関して正しくExecutorService
を使用していますか?上記をスレッドセーフにするにはどうすればよいですか?
役に立つと思われる場合は必ず回答を受け入れるようにしてください。 – Gray