2016-10-25 9 views
0

다중 스레드 환경에서 스프링 amqp의 주석 기반 접근 방식을 사용하고 있습니다 (여러 소비자 => 여러 개의 토끼 수신기 컨테이너가 있음).어디에 멀티 스레드 환경에서 수신 rabbitListener 구성 요소 내에 스레드 종속 데이터를 저장해야합니까?

@RabbitListener(queues = "tasks") 
public void receiveMessage(@Payload Task task) { 
    // usage of httpClient here with its own httpContext (would be fine) 
    // this method gets called from different listenerContainers/threads 
} 

주석 처리 된 receiveMessage() 메소드가 포함 된 구성 요소는 http http 클라이언트에서 http 호출을해야합니다. 여러 소비자와 동시에 작업하고 있기 때문에이 메서드는 다른 스레드에서 호출되며 apache http 클라이언트 설명서에서는 각 스레드가 스레드로부터 안전하도록 httpContext를 만들어야한다고 말합니다. 모든 스레드가 동일한 구성 요소 메소드를 호출하므로 구성 요소에 httpContext를 넣을 수 없습니다.

httpClientContext를 넣을 수있는 각 리스너 컨테이너에 대한 리스너 컨테이너 컨텍스트가 있습니까? 아니면 누군가가 쉽게 해결할 수있는 아이디어를 가지고 있습니까? 내가 ThreadLocal 또는 httpContexts에 대한 중앙 레지스트리에 대해 생각하지만, 이것이 더 쉬울 것이라고 괜찮을 것입니다.

답변

1

프레임 워크에서 제공하는 것과 같은 것은 없습니다. 가장 간단한 해결책은 LinkedBlockingQueue과 같은 항목에 저장하고 체크 아웃 한 다음 사용하고 완료되면 큐에 다시 넣는 것입니다 (큐가 비어있는 경우 필요에 따라 큐를 만드는 것).

ThreadLocal도 작동하지만 수영장을 선호합니다.