2017-10-04 7 views
1

J'ai déclaré ThreadPoolTaskExecutor comme @Bean selon mon contexte d'application comme:Dois-je avoir un ThreadPoolTaskExecutor singleton pour partager différents services?

@Configuration 
@ConfigurationProperties(prefix = "application") 
@EnableCaching 
public class ApplicationConfig { 
    private static final int POOL_SIZE = 2; 

    @Bean 
    public ThreadPoolTaskExecutor taskExecutor() { 
     ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); 
     pool.setCorePoolSize(POOL_SIZE); 

     return pool; 
    } 
} 

J'ai 2 services différents qui ont besoin de se câblé une instance de ThreadPoolTaskExecutor. Chaque service soumettra un Runnable qui effectuera un travail spécifique au service.

Par exemple, ce sont les 2 services:

@Service 
public class TerminatedContractsService { 
    @Autowired 
    private ThreadPoolTaskExecutor taskExec; 

    public void notifyTerminatedContracts(Date d) { 
     // do some contract specific work 
     taskExec.submit(() -> System.out.println("emailing terminated contracts...")); 
    } 
} 


@Service 
public class SalaryCalculationService { 
    @Autowired 
    private ThreadPoolTaskExecutor taskExec; 

    public void calculateSalary(Date d) { 
     // do some salary related work 
     taskExec.submit(() -> System.out.println("calculating salaries...")); 
    } 
} 

Est doit être sûr de partager la même instance de ThreadPoolTaskExecutor (depuis sa singleton) pour les bons services?

Prévoyez-vous des problèmes avec cela et si je devrais prototype à la place?

Répondre

1

Oui, plusieurs services peuvent utiliser le même exécuteur. Il n'y a aucun état tenu par l'exécuteur qui ferait une bonne idée de le jeter et d'en créer un nouveau.

Il peut y avoir des choses à surveiller. Si vous avez des tâches de durée variable que vous soumettez au même exécuteur, les tâches de courte durée peuvent être bloquées si elles sont mises en file d'attente derrière celles qui sont en cours d'exécution. Vous pouvez vous assurer que les tâches soumises à un exécuteur ont des durées similaires.

De même, si vous avez une catégorie de tâche que vous devez exécuter de manière prévisible et fiable, vous voudrez peut-être réserver un exécuteur dédié. Sinon, si ces tâches partagent une file d'attente avec d'autres et qu'un problème empêche ces tâches de se terminer ou les ralentit, les tâches dont vous avez besoin d'exécuter de manière fiable risquent d'être bloquées derrière elles.

Mais non, la portée du prototype ne devrait pas être nécessaire.

+0

Je vois, merci d'avoir souligné les conséquences sur les performances. –