2012-11-03 10 views
10

La mia domanda è molto simile a questa: @Async prevent a thread to continue until other thread have finishednumero Primavera @Async limite di fili

Fondamentalmente ho bisogno corro ~ centinaia di calcoli in più thread. Voglio eseguire solo una certa quantità di thread paralleli, ad es. 5 thread con 5 computazioni in paralell.

Sto usando framework di primavera e l'opzione @Async è una scelta naturale. Non ho bisogno della coda JMS completa, per me è un po 'troppo.

Qualche idea? Grazie

risposta

12

Avete controllato Task Executor? È possibile definire un pool di thread, con un numero massimo di thread per eseguire le attività.

Se si desidera utilizzarlo con @Async, utilizzare questo in primavera-config:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/> 

<task:executor id="myExecutor" pool-size="5"/> 

<task:scheduler id="myScheduler" pool-size="10"/> 

di riferimento completa here (25.5.3). Spero che questo ti aiuti.

16

Se si sta utilizzando Java-configurazione di primavera, la classe di configurazione deve implementa AsyncConfigurer:

@Configuration 
@EnableAsync 
public class AppConfig implements AsyncConfigurer { 

    [...] 

    @Override 
    public Executor getAsyncExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(2); 
     executor.setMaxPoolSize(5); 
     executor.setQueueCapacity(50); 
     executor.setThreadNamePrefix("MyExecutor-"); 
     executor.initialize(); 
     return executor; 
    } 
} 

Vedi @EnableAsync documentazione per maggiori dettagli: http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html

+0

cosa succede se ho bisogno di più asyncs? – Dejell

+0

È possibile annotare diversi metodi con '@ Async' e condivideranno il pool di thread/esecutore definito con la configurazione' @ EnableAsync'. – Siggen

+0

Intendo: diversi esecutori con configurazioni diverse per ogni – Dejell