5

В моем приложении мне приходится обрабатывать несколько заданий асинхронно из основного потока приложений и собирать результат каждого задания. У меня есть простое Java-решение, которое делает это с помощью ExecutorService и ExecutorCompletionService, который собирает результаты работы.Весенний эквивалент CompletionService?

Теперь я хотел бы преобразовать свой код в решение Spring. docs показать мне, как использовать аннотацию ExecutorService и @Async, но я не уверен, как и могу ли я собирать результаты нескольких заданий.

Другими словами: Я ищу эквивалент Spring для CompletionService. Что-то подобное существует?

Мой текущий код:

class MyService { 

private static ExecutorService executorService; 
private static CompletionService<String> taskCompletionService; 

// static init block 
static { 
    executorService = Executors.newFixedThreadPool(4); 
    taskCompletionService = new ExecutorCompletionService<String>(executorService); 

    // Create thread that keeps looking for results 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Future<String> future = taskCompletionService.take(); 
        String s = future.get(); 
        LOG.debug(s); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } catch (ExecutionException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    }).start(); 
} 

// This method can and will be called multiple times, 
// so multiple jobs are submitted to the completion service 
public void solve(List<Long> ids) throws IOException, SolverException { 
    String data = createSolverData(ids); 
    taskCompletionService.submit(new SolverRunner(data, properties)); 
} 
} 

ответ

1

Вы должны учитывать, что ваша главная цель, потому что ваш текущий код будет работать нормально, наряду с другими Спринг-ассоциированных классов. Spring предоставляет поддержку родной Java ExecutorService, а также другой популярной сторонней библиотеки, такой как Quartz

Возможно, что вам нужно настроить службу-исполнитель на весеннем контейнере (например, используя следующую конфигурацию на ваших весенних бобах xml)

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 

и украсить свой MyService класс с @Service аннотацию и ввести ссылку на службу исполнителя

0

я оказался определяющим мои бобы в контексте Spring приложения и закачки в completionservice в MyService. Работает как шарм.

<task:executor id="solverExecutorService" pool-size="5" queue-capacity="100" /> 
<spring:bean id="solverCompletionService" class="nl.marktmonitor.solver.service.SolverCompletionService" scope="singleton"> 
    <constructor-arg name="executor" ref="solverExecutorService"/> 
</spring:bean> 

 Смежные вопросы

  • Нет связанных вопросов^_^