2016-09-08 6 views
5

I가 나의 봄 부팅 응용 프로그램에서 다음과 같은 구성 : 나는 그것을 실행할 때 CPU 사용량이 100 %에 도달봄 부팅 응용 프로그램

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

(때로는 100 일) :

enter image description here

VisualVM과 함께 조사하고,이

enter image description here

참조

AsyncTaskExecutor의 인스턴스를 제거하면 CPU 사용량이 0.4 %로 증가하고 visualvm은 CPU 사용량의 거의 1 %를 차지합니다.
docker로 배포하는 동안이 문제가 발견되어 호스트 사용이 천장에 닿았습니다.
1024로 버퍼 크기를 낮추려고 시도했지만 (2048) 아무 것도 변경되지 않았습니다.
이 bean이 없으면 내 @Async 서비스가 비동기 적으로 작동하지 않습니다. (No TaskExecutor bean found for async processing)

답변

3

나는 생각한다. 어떤 이유로

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

다음과 같이 내가 무슨 짓을
ThreadPoolTaskExecutor이 다른 사람보다 가볍고, 사용 ThreadPoolTaskExecutor 대신 RingBuffer했다.
나는 이것을 spring framework doc

에서 가져 왔습니다.
관련 문제