2016-05-20 4 views
9

У меня есть следующие 3 класса:Spring @Scheduler параллельно работает

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, с помощью которого должно быть возможно определить, сколько потоков мы хотим ...

Я прав? Я не могу найти, как предоставить эту информацию.

ответ

15

The documentation четко говорится, что:

По умолчанию будет искать ассоциированное определение планировщика: либо уникальный TaskScheduler компонента в контексте, или 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); 
    } 
}