복붙노트

[SPRING] XML 스프링 스케줄링 설정에서 주석 / 코드 설정으로 이동하는 방법?

SPRING

XML 스프링 스케줄링 설정에서 주석 / 코드 설정으로 이동하는 방법?

다음 Spring 작업 xml 구성을 순전히 코드 / 주석 기반 버전으로 변환하려고합니다.

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

Spring 스펙 28.4.1 (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html)에 따르면, 그들은 XML에서 다음과 같이 이동한다고 말한다 :

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

코드 구성은 @EnableScheduling 및 / 또는 @EnableAsync를 활성화하는 것과 같습니다.

그러나 실제로 어디서나 스케줄러를 인스턴스화 할 수는 없습니다. @EnableScheduling (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html)에 대한 javadoc은 내가 만든 Executor를 어떻게 플러그인 할 수 있는지 보여줍니다. 어떤 클래스가되어야하는지 확실히 모르겠지만 (여전히 풀 크기, 대기열 용량 및 거부 정책을 제어 할 수 있기를 원합니다). 또한 configureTasks 재정의를 사용하여 createPartitions 메소드를 예약하는 방법을 보여줍니다. 그러나, 나는 (그래서 나는 그 스레드를 식별 할 수 있습니다) 내 스케줄러 이름을 지정하고 풀 크기를 제어 할 수 싶습니다.

그래서 나는이 것들을 알고 싶다 :

1) XML이 가지고있는 Executor 필드를 설정하기 위해 어떤 클래스를 사용할 수 있습니까?

2) 내가 이름과 풀 크기를 제어 할 수있는 스케줄러 인스턴스를 만드는 방법이 있습니까?

해결법

  1. ==============================

    1.AsyncConfigurer, AsyncConfigurerSupport 및 SchedulingConfigurer 유형을 확인하십시오. 비동기 / 스케줄링 구성으로 @Configuration 클래스를 향상시키는 데 사용할 수있는 도우미 유형입니다.

    AsyncConfigurer, AsyncConfigurerSupport 및 SchedulingConfigurer 유형을 확인하십시오. 비동기 / 스케줄링 구성으로 @Configuration 클래스를 향상시키는 데 사용할 수있는 도우미 유형입니다.

    이들 모두와 @EnabledAsync의 javadoc을 통해 비동기 / 스케줄 @Configuration 클래스를 설정하는 데 필요한 모든 설정 방법을 찾을 수 있습니다.

    주어진 예제는 같음

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

     <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에는 작업 : scheduler에 대한 비슷한 설정이 있습니다.

  2. ==============================

    2.더 세분화 된 제어를 원하면 SchedulingConfigurer 및 / 또는 AsyncConfigurer 인터페이스를 추가로 구현할 수 있습니다.

    더 세분화 된 제어를 원하면 SchedulingConfigurer 및 / 또는 AsyncConfigurer 인터페이스를 추가로 구현할 수 있습니다.

    다음과 같이,

    수영장도 보시고,

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

    그리고 비동기를 위해서,

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

    이 기능을 사용하려면 @EnableAsync 및 @EnableScheduling이 있어야합니다.

  3. from https://stackoverflow.com/questions/27970650/how-to-go-from-xml-spring-scheduling-configuration-to-annotation-code-configurat by cc-by-sa and MIT license