2016-05-20 31 views
9

ho le seguenti classi: 3Spring @Scheduler parallelo esecuzione

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

Quando eseguire, sto ottenendo il seguente output:

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

ho bisogno dei 2 metodi pianificata l'esecuzione in parallelo, che non è chiaramente il CAE secondo l'uscita mi sto . Ho letto che dovrebbe essere possibile fornire l'annotazione @Schedule con un TaskExecutor personalizzato, con il quale dovrebbe essere possibile definire quanti thread vogliamo ...

Ho ragione? Non riesco a trovare come fornire queste informazioni.

risposta

15

The documentation afferma chiaramente che:

Per impostazione predefinita, sarà alla ricerca di una definizione di scheduler associato: sia un unico TaskScheduler fagiolo nel contesto, o di un fagiolo TaskScheduler denominato "TaskScheduler" altrimenti; la stessa ricerca sarà anche eseguita per un bean ScheduledExecutorService. Se nessuno dei due è risolvibile, uno scheduler predefinito a thread singolo locale sarà creato e utilizzato all'interno del registrar.

Quando si desidera un maggiore controllo, una classe @Configuration può implementare SchedulingConfigurer. Ciò consente l'accesso all'istanza di ScheduledTaskRegistrar sottostante . Ad esempio, il seguente esempio dimostra come personalizzare l'Esecutore utilizzato per eseguire in programma compiti:

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