2015-01-15 12 views
10

Sto cercando di convertire la seguente configurazione primavera compito xml a una versione basata puramente Codice/annotazione:Come passare dalla configurazione della pianificazione XML Spring alla configurazione di annotazioni/codici?

<task:executor id="xyz.executor" 
    pool-size="${xyz.job.executor.pool.size:1-40}" 
    queue-capacity="${xyz.job.executor.queue.capacity:0}" 
    rejection-policy="CALLER_RUNS"/> 

<task:scheduler id="xyz.scheduler" pool size="${xyz.job.scheduler.pool.size:4}" /> 

<task:annotation-driven executor="xyz.executor" scheduler="xyz.scheduler" /> 

<bean id='xyzProcessor' class="xyz.queueing.QueueProcessor" /> 

<task:scheduled-tasks scheduler="xyz.scheduler" > 
    <task:scheduled ref="partitioner" method="createPartitions" cron="${xyz.job.partitioner.interval:0 0 3 * * *}" /> 
</task:scheduled-tasks> 

Per le specifiche Primavera, 28.4.1 (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html), si dice che per andare da XML come questo :

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/> 
<task:executor id="myExecutor" pool-size="5"/> 
<task:scheduler id="myScheduler" pool-size="10"/> 

per la configurazione del codice è semplice quanto l'attivazione di @EnableScheduling e/o @EnableAsync.

Tuttavia, non vedo da nessuna parte che sia possibile creare un'istanza dello scheduler. Il javadoc per @EnableScheduling (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html) mostra come posso collegare il mio Executor creato, anche se non sono esattamente sicuro di quale classe dovrebbe essere (voglio comunque essere in grado di controllare le dimensioni del pool, la capacità della coda e il rifiuto politica). Mostra anche come posso pianificare il mio metodo createPartitions usando l'override di configureTasks. Tuttavia, mi piacerebbe essere in grado di nominare il mio scheduler (in modo che possa identificare i suoi thread) e controllare la sua dimensione del pool.

Così, desidero sapere queste cose:

1) Che classe posso usare per impostare i campi esecutore che l'XML è?

2) Esiste un modo per creare un'istanza dello scheduler che possa controllare il nome e la dimensione del pool di?

risposta

10

Verificare i tipi AsyncConfigurer, AsyncConfigurerSupport e SchedulingConfigurer. Sono tipi di supporto che è possibile utilizzare per migliorare la propria classe @Configuration con configurazioni asincrone/di pianificazione.

Tra tutti loro, e la javadoc di @EnabledAsync, sono disponibili tutti i metodi di configurazione necessari per impostare la classe async/scheduling @Configuration.

L'esempio fornito equivale

@Configuration 
@EnableAsync 
public class AppConfig implements AsyncConfigurer { 

    @Bean 
    public MyAsyncBean asyncBean() { 
     return new MyAsyncBean(); 
    } 

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

    @Override 
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
     return new MyAsyncUncaughtExceptionHandler(); 
    } 
} 

con

<beans> 
    <task:annotation-driven executor="myExecutor" exception-handler="exceptionHandler"/> 
    <task:executor id="myExecutor" pool-size="7-42" queue-capacity="11"/> 
    <bean id="asyncBean" class="com.foo.MyAsyncBean"/> 
    <bean id="exceptionHandler" class="com.foo.MyAsyncUncaughtExceptionHandler"/> 
</beans> 

SchedulingConfigurer ha una configurazione simile per task:scheduler.

+0

Ciò è utile per la parte executor, ma come posso controllare la dimensione o il nome del pool su un programma di pianificazione? – AHungerArtist

+1

@ahu Nell'esempio sopra, noterete che ci sono metodi per impostare la dimensione del pool. C'è anche un metodo per impostare un 'ThreadFactory' in cui è possibile controllare i nomi dei thread creati. –

+0

L'ho capito ora; Ero un po 'confuso prima. Grazie. – AHungerArtist

3

Se si desidera un controllo più dettagliato è possibile implementare ulteriormente le interfacce SchedulingConfigurer e/o AsyncConfigurer.

come belows,

Si prega di notare le piscine anche,

@Configuration 
@EnableScheduling 
public class CronConfig implements SchedulingConfigurer{ 

    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
     taskRegistrar.setScheduler(taskExecutor());  
    } 


    @Bean(destroyMethod="shutdown") 
    public Executor taskExecutor() { 
     return Executors.newScheduledThreadPool(10); 
    } 

} 

E per i Asyncs,

@Configuration 
@EnableAsync 
public class AsyncConfig implements AsyncConfigurer { 

    @Override 
    public Executor getAsyncExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(5); 
     executor.setMaxPoolSize(10); 
     executor.setQueueCapacity(100); 
     executor.initialize(); 
     return executor; 
    } 

    @Override 
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
     return new SimpleAsyncUncaughtExceptionHandler(); 
    } 
} 

noti che @EnableAsync e @EnableScheduling deve essere lì per questo lavoro.

Problemi correlati