2016-09-08 18 views
5

Tôi có cấu hình sau đây trong ứng dụng Boot mùa xuân của tôi:xuân tiêu thụ tất cả các cpu khi AsyncTaskExecutor được cấu hình

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

khi tôi chạy nó, việc sử dụng cpu lượt truy cập 100% (đôi khi 100 gì đó):

enter image description here

tra với VisualVM, tôi thấy điều này

enter image description here

nhưng, khi tôi xóa bản sao của AsyncTaskExecutor mức sử dụng CPU giảm xuống 0,4% và hình ảnh hiển thị cho tôi hầu như không sử dụng CPU 1%.
Tôi đã tìm thấy vấn đề này trong khi triển khai nó với docker, tôi thấy việc sử dụng máy chủ của tôi đã tăng trần.
Tôi đã thử giảm kích thước bộ đệm (nó là 2048) xuống 1024 nhưng không có gì thay đổi.
Nếu không có bean này, các dịch vụ @Async của tôi không hoạt động không đồng bộ. (No TaskExecutor bean found for async processing)

Trả lời

3

Tôi nghĩ rằng tôi đã giải quyết.
Những gì tôi đã làm là sử dụng ThreadPoolTaskExecutor thay RingBuffer, như sau

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

đối với một số lý do, ThreadPoolTaskExecutor nhẹ hơn những người khác.
Tôi nhận được điều này từ spring framework doc

Các vấn đề liên quan