5

Uygulamamda, temel iş parçacığından eşzamansız olarak birden çok iş almalı ve her işin sonucunu toplamalıyım. İş sonuçları toplayan bir ExecutorService ve ExecutorCompletionService kullanarak bunu yapan basit bir Java çözümüm var.Spring CompletionService eşdeğeri?

Şimdi kodumu Spring çözümüne dönüştürmek istiyorum. docs, ExecutorService ve @Async açıklamasının nasıl kullanıldığını gösterir, ancak birden çok işin sonuçlarını nasıl ve ne şekilde toplayabileceğimi bilmiyorum. Başka bir deyişle: CompletionService'nin Spring eşdeğerini arıyorum. Böyle bir şey var mı?

Benim geçerli kod:

Eğer geçerli kod diğer İlkbahar-ilişkili sınıfların yanında iyi çalışır, çünkü asıl amacı ne dikkate almak gerekir
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)); 
} 
} 

cevap

1

. Spring, yerel Java ExecutorService'nin yanı sıra Quartz

için diğer popüler 3. parti kitaplığı için destek sağlar. Muhtemelen peşinde olduğunuzda, kapsayıcı hizmetini yaylı kapsayıcıya kuruyorsunuz (örneğin: bahar fasulye xml'inizde aşağıdaki yapılandırmayı kullanarak)

<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> 

ve @Service açıklama ile MyService sınıf süslemeleri ve ben MyService içine Bahar uygulama bağlamında ve enjeksiyon içinde completionservice benim fasulye tanımlayan sona erdi infaz hizmeti

0

başvurusunu enjekte edin. Bir çekicilik olarak çalışır.

<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>