2016-09-08 1 views
5

je la configuration suivante dans mon application Boot Spring:application de démarrage de printemps consommer tous les cpu quand AsyncTaskExecutor est configuré

@Configuration 
@EnableAsync 
@Slf4j 
public class AsyncConfig { 
    private static final int BUFFER = 1024; 

    @Bean 
    public AsyncTaskExecutor singleThreadAsyncTaskExecutor(Environment env) { 
     RingBufferAsyncTaskExecutor rbAsyncExecutor = new RingBufferAsyncTaskExecutor(env); 
     rbAsyncExecutor.setName("rb-executor"); 
     rbAsyncExecutor.setBacklog(BUFFER); 
     rbAsyncExecutor.setProducerType(ProducerType.SINGLE); 
     rbAsyncExecutor.setWaitStrategy(new YieldingWaitStrategy()); 

     log.info("Async task executor loaded"); 
     return rbAsyncExecutor; 
    } 
} 

quand je le lance, la frappe utilisation cpu 100% (parfois 100 quelque chose):

enter image description here

enquête avec visualvm, je vois ce

enter image description here

mais, lorsque je supprime l'instanciation de AsyncTaskExecutor, l'utilisation du processeur passe à 0,4% et le visualvm me montre à peine 1% de l'utilisation du processeur.
J'ai trouvé ce problème en le déployant avec docker, j'ai vu mon utilisation de l'hôte frapper le plafond.
J'ai essayé de réduire la taille du tampon (c'était 2048) à 1024 mais rien n'a changé.
Sans ce bean, mes services @Async ne fonctionnent pas de manière asynchrone. (No TaskExecutor bean found for async processing)

Répondre

3

Je pense que j'ai résolu.
Ce que je faisais était utilisé à la place ThreadPoolTaskExecutor ringbuffer, comme suit

@Bean 
public AsyncTaskExecutor getAsync(){ 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(7); 
    executor.setMaxPoolSize(42); 
    executor.setQueueCapacity(11); 
    executor.setThreadNamePrefix("AsyncExec-"); 
    executor.initialize(); 
    return executor; 
} 

pour une raison quelconque, le ThreadPoolTaskExecutor est plus léger que les autres.
J'ai reçu ceci de spring framework doc