5

W mojej aplikacji muszę przetwarzać wiele zadań asynchronicznie z głównego wątku aplikacji i zbierać wyniki każdego zadania. Mam proste rozwiązanie Java, które wykonuje to za pomocą ExecutorService i ExecutorCompletionService, która zbiera wyniki pracy.Wiosenny odpowiednik usługi CompletionService?

Teraz chciałbym przekonwertować mój kod na rozwiązanie Spring. docs pokazuje mi, jak używać atrybutu ExecutorService i @Async, ale nie jestem pewien, jak i czy mogę zebrać wyniki wielu zadań.

Innymi słowy: Szukam wiosennego odpowiednika usługi CompletionService. Czy jest coś takiego?

Mój bieżący kod:

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)); 
} 
} 

Odpowiedz

1

Trzeba rozważyć, co jest głównym celem, ponieważ aktualny kod będzie działać dobrze obok innych klasach sprężynowy związane. Spring zapewnia obsługę natywnej obsługi Java ExecutorService, a także innej popularnej biblioteki innej firmy, takiej jak Quartz

Prawdopodobnie to, czego szukasz, to konfigurowanie usługi executora na pojemniku sprężynowym (np. Użycie następującej konfiguracji na twoim źródle fasoli 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> 

i ozdobić swoją klasę MyService z @Service adnotacji i wstrzyknąć odwołanie do usługi executora

0

skończyło się na definiowaniu moje fasoli w kontekście aplikacji Wiosna i wtrysku z completionservice do MyService. Działa jako urok.

<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> 
Powiązane problemy