In meiner Anwendung habe ich mehrere scheduler
Threads, die Aufgaben erstellen. Zum Beispiel jeweils Scheduler-Threads können Bündel von Aufgaben erstellen:Mehrere schedule target sendestasks RejectedExecutionException
TaskCreator tastCreator;
for (Report report: report) {
taskCreator.createTask(report);
}
Die Scheduler-Threads gleichzeitig ausgeführt werden können, wie Sie aus den Protokollen sehen:
15:57:20.107 INFO [ scheduler-4] c.task.ReportExportSchedulerTask : Task created
15:57:20.107 INFO [ scheduler-2] c.task.ReportExportSchedulerTask : Task created
Ich habe eine TaskCreator
Komponente wie folgt, dass Pässe die Aufgabe der 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
wie folgt, dass konstruiert ein executorService
auf die ich die oben genannten Aufgaben zu übermitteln:
@Component
public class SftpTaskExecutor {
private ExecutorService executorService = Executors.newSingleThreadExecutor();
public void executeJob(JobProcessorTask jobProcessorTask) {
executorService.execute(jobProcessorTask);
}
public ExecutorService getExecutorService() {
return executorService;
}
}
meine Frage, wenn zwei oder mehr scheduler Threads Aufgaben erstellen und Einreichen Dienst gleichzeitig Executer, wirft der oben eine RejectedExecutionException
wenn eine Scheduler-Task nicht beendet ist (d. h Datei nicht gesendet)
Für jede Zeitplan Threads, ich muss validateTasksExecution()
aufrufen können, ohne den anderen Scheduler-Thread zu stören. Mit anderen Worten, nicht trennen, während der andere Scheduler noch verarbeitet.
Bin ich die ExecutorService
in dieser Hinsicht richtig verwenden? Wie kann ich das oben genannte ändern, um threadsicher zu sein?
Achten Sie darauf, eine Antwort zu akzeptieren, wenn es hilfreich war. – Gray