programing

Spring @Scheduler 병렬 실행

testmans 2023. 6. 19. 21:17
반응형

Spring @Scheduler 병렬 실행

저는 다음 3개의 수업이 있습니다.

성분a

package mytest.spring.test.spring;

import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ComponentA {

    Logger log = Logger.getLogger(ComponentB.class);

    @Scheduled(fixedRate=2000)
    public void sayHello() {
        for(int i=1 ; i<=5 ; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            log.info("Hello from ComponentA " + i);
        }
    }
}

구성요소 B

package mytest.spring.test.spring;

import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ComponentB {

    Logger log = Logger.getLogger(ComponentB.class);

    @Scheduled(fixedRate=2000)
    public void sayHello() {
        for(int i=1 ; i<=3 ; i++) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            log.info("Hello from ComponentB " + i);
        }
    }
}

내 응용 프로그램

package mytest.spring.test.spring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

이를 실행하면 다음과 같은 출력이 표시됩니다.

Hello from ComponentA 1
Hello from ComponentA 2
Hello from ComponentA 3
Hello from ComponentA 4
Hello from ComponentA 5
Hello from ComponentB 1
Hello from ComponentB 2
Hello from ComponentB 3
Hello from ComponentA 1
Hello from ComponentA 2
Hello from ComponentA 3
Hello from ComponentA 4
Hello from ComponentA 5
Hello from ComponentB 1
Hello from ComponentB 2
Hello from ComponentB 3
...

나는 병렬로 실행하기 위해 2개의 예약된 메소드가 필요한데, 이것은 내가 받고 있는 출력에 따르면 분명히 cae가 아닙니다.@Schedule 주석을 사용자 지정 TaskExecutor와 함께 제공할 수 있어야 하며, 이를 통해 원하는 스레드 수를 정의할 수 있어야 합니다...

맞나요? 이 정보를 제공하는 방법을 찾을 수 없습니다.

설명서에는 다음 사항이 명시되어 있습니다.

기본적으로 에서는 연관된 스케줄러 정의를 검색합니다. 즉, 고유한 스케줄러 정의입니다.TaskScheduler맥락에 있는 존재, 또는TaskScheduler그렇지 않으면 "taskScheduler"로 명명됩니다. 동일한 룩업도 수행됩니다.ScheduledExecutorService둘 다 해결할 수 없는 경우 로컬 단일 스레드 기본 스케줄러가 생성되어 레지스트라 내에서 사용됩니다.

더 많은 제어가 필요한 경우 @Configuration 클래스에서 SchedulingConfigurer를 구현할 수 있습니다.이렇게 하면 기본 예약된 작업 등록자 인스턴스에 액세스할 수 있습니다.예를 들어, 다음 예제에서는 예약된 태스크를 실행하는 데 사용되는 Executor를 사용자 정의하는 방법을 보여 줍니다.

@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {

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

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

언급URL : https://stackoverflow.com/questions/37344801/spring-scheduler-parallel-running

반응형