2016-09-08 15 views
5

Ben benim Bahar Boot uygulamasında aşağıdaki yapılandırma: Bunu çalıştırdığınızda, cpu kullanımı% 100 vururbahar çizme uygulaması

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

(bazen 100 şey):

enter image description here

visualvm ile soruşturma, ben bu

enter image description here

bkz

, ancak, AsyncTaskExecutor örneğini kaldırdığımda, CPU kullanımı% 0,4'e gider ve visualvm bana CPU kullanımının ancak% 1'ini gösterir.
Docker ile konuşlandırırken bu sorunu buldum, ana bilgisayar kullanımının tavana çarptığını gördüm.
Tampon boyutunu (2048 idi) 1024'e düşürdüm ama hiçbir şey değişmedi.
Bu çekirdek olmadan, @Async hizmetlerim senkronize olmayan bir şekilde çalışmıyor. (No TaskExecutor bean found for async processing)

cevap

3

Sanırım çözdüm. nedense

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

şöyle Yaptıklarımı
ThreadPoolTaskExecutor diğerlerinden daha hafif, kullanımı ThreadPoolTaskExecutor yerine Ringbuffer oldu.
Bunu anladım spring framework doc

İlgili konular