Параллельный запуск Spring @Scheduler
у меня есть следующие 3 класса:
ComponantA
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);
}
}
}
ComponentB
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);
}
}
}
MyApplication
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, с помощью которого можно определить, сколько потоков мы хотим ...
Я прав ? Я не могу найти, как предоставить эту информацию.
1 ответов
документация четко указано, что:
по умолчанию будет выполняться поиск связанного определения планировщика: либо уникальный
TaskScheduler
bean в контексте, илиTaskScheduler
боб с именем "taskScheduler" в противном случае; тот же поиск также будет проведенные наScheduledExecutorService
бобовые. Если ни один из двух разрешимо, локальный однопоточный планировщик по умолчанию будет создан и используется в регистраторе.когда больше контроля желаемый, класс @Configuration может реализовать SchedulingConfigurer. Это позволяет получить доступ к базовому Экземпляр ScheduledTaskRegistrar. Например, следующий пример демонстрирует настройку исполнителя, используемого для выполнения запланированного задачи:
@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);
}
}