Я пытаюсь отправить несколько заданий и получить результаты по мере их поступления. Однако после окончания цикла я должен обеспечить, чтобы все задачи выполнялись в течение определенного периода времени. Если нет, сделайте ошибку. Изначально все, что у меня было, - invokeAll, shutdown и callerService, и awaitTermination звонки, которые были использованы для обеспечения выполнения всех задач (несмотря на ошибки или нет). Я перенес код, чтобы использовать CompletionService, чтобы отобразить результаты. Где я могу принудительно выполнить предложение waitaitTermination в вызовах CompletionService?Enforce executorService.awaitTermination при использовании CompletionService
CompletionService<String> completionService = new ExecutorCompletionService<String>(executor);
logger.info("Submitting all tasks");
for (Callable<String> task : tasks)
completionService.submit(task);
executor.shutdown();
logger.info("Tasks submitted. Now checking the status.");
while (!executor.isTerminated())
{
final Future<String> future = completionService.take();
String itemValue;
try
{
itemValue = future.get();
if (!itemValue.equals("Bulk"))
logger.info("Backup completed for " + itemValue);
}
catch (InterruptedException | ExecutionException e)
{
String message = e.getCause().getMessage();
String objName = "Bulk";
if (message.contains("(") && message.contains(")"))
objName = message.substring(message.indexOf("(") + 1, message.indexOf(")"));
logger.error("Failed retrieving the task status for " + objName, e);
}
}
executor.awaitTermination(24, TimeUnit.HOURS);
Другими словами, как я могу использовать тайм-аут для CompletionService?
EDIT:
Исходный код, который я имел отображалось ниже. Проблема в том, что я повторяю в будущем списке, а затем печатаю их как завершенные. Однако мое требование состоит в том, чтобы отобразить те, которые были заполнены на основе FCFS.
List<Future<String>> results = executor.invokeAll(tasks);
executor.shutdown();
executor.awaitTermination(24, TimeUnit.HOURS);
while (results.size() > 0)
{
for (Iterator<Future<String>> iterator = results.iterator(); iterator.hasNext();)
{
Future<String> item = iterator.next();
if (item.isDone())
{
String itemValue;
try
{
itemValue = item.get();
if (!itemValue.equals("Bulk"))
logger.info("Backup completed for " + itemValue);
}
catch (InterruptedException | ExecutionException e)
{
String message = e.getCause().getMessage();
String objName = "Bulk";
if (message.contains("(") && message.contains(")"))
objName = message.substring(message.indexOf("(") + 1, message.indexOf(")"));
logger.error("Failed retrieving the task status for " + objName, e);
}
finally
{
iterator.remove();
}
}
}
}
Но почему? Похоже, что 'CompletionService' не подходит для проблемы, которую вы пытаетесь решить. Что случилось с 'invokeAll'? – kan
Кроме того, непонятно, почему вам нужно 'awaitTermination'. Просто используйте 'invokeAll', как описано здесь: http://stackoverflow.com/a/3269888/438742 – kan
Чтобы отобразить, какие процессы были выполнены сначала в журнале, мне требуется CompletionService. Если я использую invokeAll, он блокируется до тех пор, пока все задачи не будут завершены, и я должен отобразить статус в том порядке, в котором будут представлены задачи. – dmachop