복붙노트

[SPRING] Spring AMQP Listener Container의 동시성은 어떻게 구현되고 있는가?

SPRING

Spring AMQP Listener Container의 동시성은 어떻게 구현되고 있는가?

내 컨테이너 XML 설정 :

<rabbit:listener-container
        connection-factory="myConnectionFactory"
        acknowledge="none"
        concurrency="10"
        requeue-rejected="false">
    <rabbit:listener ref="myListener" queues="myQueue"/>
</rabbit:listener-container>

및 myListener 그냥 클래스입니다.

@Component("myListener")
public class MyListener implements MessageListener {
    @Autowired
    SomeDependency dependency;
    ....
}

내 XML에서 concurrency = "10"을 지정했습니다. 이것은 정확히 무엇을 의미합니까?

나는 몇몇 문서를 발견했다. 그들은 도움이되는 진술이 아니다 :

내가 관심있는 부분은 MyListener가 스레드로부터 안전해야하는지 여부입니다.

해결법

  1. ==============================

    1.예, 동시성을 사용하려면 리스너가 스레드로부터 안전해야합니다. 컨테이너 당 하나의 리스너 인스턴스가 있습니다. 그러나 네임 스페이스 요소는 실제로 "공유"특성을 추가하기위한 편의 일 뿐이며 각 수신기 요소는 자체 컨테이너를 가져옵니다.

    예, 동시성을 사용하려면 리스너가 스레드로부터 안전해야합니다. 컨테이너 당 하나의 리스너 인스턴스가 있습니다. 그러나 네임 스페이스 요소는 실제로 "공유"특성을 추가하기위한 편의 일 뿐이며 각 수신기 요소는 자체 컨테이너를 가져옵니다.

    일반적으로 스테이트리스 오브젝트 (쓰여지는 필드 없음)를 사용하는 것이 가장 좋지만 항상 가능하지는 않습니다.

    리스너가 스레드로부터 안전하지 않으면 다음을 사용할 수 있습니다.

    <rabbit:listener-container
        connection-factory="myConnectionFactory"
        acknowledge="none"
        requeue-rejected="false">
        <rabbit:listener ref="myListener" queues="myQueue"/>
        <rabbit:listener ref="myListener" queues="myQueue"/>
        <rabbit:listener ref="myListener" queues="myQueue"/>
        <rabbit:listener ref="myListener" queues="myQueue"/>
        ...
    </rabbit:listener-container>
    

    ... @Scope (ConfigurableBeanFactory.SCOPE_PROTOTYPE)을 추가하십시오. 그런 다음 각 리스너에 대한 컨테이너를 가져오고 다른 리스너 인스턴스가 각 리스너에 주입됩니다.

    리스너에 삽입 된 thread-safe가 아닌 모든 종속성에 대한 프로토 타입 범위가 필요합니다.

  2. from https://stackoverflow.com/questions/23341811/how-is-concurrency-in-spring-amqp-listener-container-implemented by cc-by-sa and MIT license