2015-01-15 10 views
10

Ich versuche, die folgenden Frühling Aufgabe XML-Konfiguration auf eine rein Code/Annotation basierte Version zu konvertieren:Wie geht man von der XML Spring Scheduling Konfiguration zur Annotation/Code Konfiguration?

<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 Früjahr spec, 28.4.1 (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html), sagen sie, dass von XML so zu gehen :

Die Code-Konfiguration ist so einfach wie die Aktivierung von @EnableScheduling und/oder @EnableAsync.

Allerdings kann ich nirgends den Scheduler tatsächlich instanziieren. Das Javadoc für @EnableScheduling (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html) zeigt, wie ich meinen eigenen erstellten Executor einstecken kann, obwohl ich nicht genau weiß, welche Klasse es sein sollte (ich möchte immer noch die Poolgröße, die Warteschlangenkapazität und die Zurückweisung steuern können) Politik). Es zeigt auch, wie ich meine createPartitions-Methode mithilfe der configureTasks-Überschreibung einplanen kann. Ich möchte jedoch meinen Scheduler benennen können (damit ich seine Threads identifizieren kann) und seine Poolgröße steuern.

So möchte ich diese Dinge wissen:

1) Welche Klasse kann ich die Testamentsvollstrecker Felder setzen verwenden, die die XML hat?

2) Gibt es eine Möglichkeit, eine Scheduler-Instanz zu erstellen, mit der ich den Namen und die Poolgröße von? Steuern kann?

Antwort

10

Überprüfen Sie die Typen AsyncConfigurer, AsyncConfigurerSupport und SchedulingConfigurer. Sie sind Helfertypen, die Sie verwenden können, um Ihre Klasse mit asynchronen/Scheduling-Konfigurationen zu erweitern.

Überall von ihnen, und der Javadoc von @EnabledAsync, finden Sie alle Setup-Methoden, die Sie benötigen, um Ihre asynchrone/Scheduling @Configuration Klasse einzurichten.

Das gegebene Beispiel entspricht

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

mit

<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 hat eine ähnliche Einrichtung für task:scheduler.

+0

Das ist hilfreich für den Executor-Teil, aber wie kontrolliere ich die Poolgröße oder den Namen auf einem Scheduler? – AHungerArtist

+1

@ahu Im obigen Beispiel werden Sie feststellen, dass es Methoden gibt, um die Poolgröße festzulegen. Es gibt auch eine Methode zum Festlegen einer 'ThreadFactory', in der Sie die Namen der erstellten Threads steuern können. –

+0

Ich verstehe es jetzt; Ich war vorher ein wenig verwirrt. Vielen Dank. – AHungerArtist

3

Wenn Sie eine feinere Steuerung wünschen, können Sie zusätzlich die Schnittstellen SchedulingConfigurer und/oder AsyncConfigurer implementieren.

als belows,

Bitte die Pools auch feststellen,

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

} 

Und für die 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(); 
    } 
} 

Beachten Sie, dass @EnableAsync und @EnableScheduling es sein muss, damit dies funktioniert.