2014-12-18 3 views
0

우리는 프로젝트가 다른 컴퓨터에서 호스팅되는 대기열을 경청해야합니다. 예를 들어 4 개의 가상 호스트가 있습니다. 각 호스트에 대해 SimpleMessageListenerContainer의 새 인스턴스를 만들었지 만 MessageListener의 한 인스턴스 (ChannelAwareListener를 구현하므로 수동으로 응답 할 수 있음)를 사용합니다. MessageListener는 봄에 의해 관리되는 빈이다. 컨테이너를 만들 때 호스트 및 컨테이너 인스턴스의 맵을 유지 관리합니다. 메시지를 받으면 호스트에서 원하는 메시지를 받았는지 확인하고 (@Resource 사용) 맵에서 컨테이너 인스턴스를 가져온 다음 호스트 수신을 중지합니다. 또한 메시지를 수동으로 ACK하고 cassandra 데이터베이스에 저장하십시오.AMQP에 대한 도움이 필요하십니까

지금은 메시지 중 일부가 데이터베이스에 유지되지 않고 손실되는 경우가 있습니다. 나는 이것이 경쟁 조건이거나 messagelistener의 인스턴스를 하나만 사용하고 있기 때문에 내가 맵 (@Resource)을 얻을 수 있도록해야한다고 생각합니다. 미안하지만 말이 안되면. AMQP를 처음 사용하고 이해하려고합니다. 어떤 제안이 좋을 것입니다. 고맙습니다!

답변

0

왜 수동 확인이 필요합니까? 일반적으로 컨테이너가 홱 잡아서 처리하도록하는 것이 좋습니다 (AUTO). 성공하면 메시지를 확인하고 리스너가 예외를 throw하면 중단됩니다.

+0

우리는 메시지를 처리하고 싶습니다. 그러면 서버가 다운되면 메시지가 손실 될 것이기 때문에 ACK를 처리하려고합니다. – user2066789

+0

컨테이너가이를 처리합니다. Spring AMQP'AUTO' ack는 컨테이너가 정상적인 청취자 완성을 확인하고 청취자가 예외를 던지면 (디폴트로 대기열에 넣음) (서버가 다운 될 경우 메시지도 다시 대기하게 됨) 것을 의미합니다. 이것은 RabbitMQ'autoAck'와는 다르다. Spring AMQP에서는'NONE'이라고 불린다. 'MANUAL' acks를 사용할 필요는 드뭅니다. –

관련 문제