2016-09-25 3 views
0

리스너가 대기열을 수신하여 일부 프리 페치 횟수가 10 인 큐를 수신하고 있습니다.이 10 개 요소를 일부 프로세서로 전달합니다. 프로세서가 일부 작업을 처리 할 수도 있고 처리하지 못하거나 지연시킬 수도 있습니다. 그리고 그러한 정보를받은 후 대기열에서 큐를 대기열에서 제거하려고합니다 (channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);).ChannelAwareMessageListener가있는 콜백 메커니즘 기능

그 목표를 달성하는 가장 좋은 방법은 무엇일까요? 하나의 아이디어는 나에게 또 다른 큐를 만들고 프로세서에서 전달 태그와 채널 참조가있는 처리 된 메시지를 푸시합니다. 그리고 나는이 새로운 대기열을 듣고 그것에 기초하여 대답을 할 것입니다.

답변

0

채널은 스레드로부터 안전하지 않습니다. rabbitmq documentation을 참조하십시오.

채널 인스턴스는 스레드간에 공유되면 안됩니다. 어플리케이션은, 복수의 thread간에 같은 채널을 공유하는 대신에, thread마다 채널을 사용하는 것을 선호 할 필요가 있습니다. 채널에 대한 일부 작업은 동시에 호출하는 것이 안전하지만 일부 작업은 와이어에 잘못된 프레임 인터리빙을 발생시키지 않으며 이로 인해 발생할 수 있습니다. 스레드간에 채널을 공유하면 * 게시자가 확인하는 데 방해가됩니다.

청취자 스레드 자체에 ChannelAwareMessageListener으로 표시된 채널 만 사용해야합니다.

동시성을 얻으려면 일반적으로 메시지를 다른 스레드로 넘겨주는 대신 컨테이너의 concurrentConsumers 속성을 사용하는 것이 좋습니다.