2011-12-06 1 views
3

메시지 확인을 보장하는 방법은 jms 브로커에서 확인 응답이 수신되는 메시지까지 메시지 만 삭제합니다. 현재 jms 대기열에서 소비하고 부분적으로 처리하는 시스템이 있습니다. 나중에이 메시지의 일괄 처리가 다른 스레드에 의해 유지됩니다. 나는 지금 메시지에 대해 인정해야한다. 그러나 문제는 내가 메시지를 소비하는 것을 멈추어야한다는 것입니다. 그렇지 않으면 이전에받은 메시지를 확인하면 다른 모든 후속 메시지를 수신하게됩니다.메시지가 확인 될 때까지만 Jms 메시지를 수신 확인

즉, 큐에 10 개의 메시지가 있다고 가정합니다. 나는 그들 중 7 명을 소비하고, 다섯 번째 메시지에서 인정한다. 이렇게하면 대기열에서 소비자가받은 7 개의 메시지가 모두 제거됩니다. 5 번째 메시지까지 대기열에서 메시지를 확인하고 제거하는 방법이 있습니다.

편집 : 나는 두 개의 세션을 생성하고 다른 세션에서 소모하지만, (아파치 qpid의이어야 포함)이 일관성 수행 노력했다. 일관성이없는 말로하면, 테스트를하는 동안 한 소비자가 메시지를받을 수있는 반면, 다른 소비자는 메시지를받지 못하는 경우도 있습니다. 얼마나 오랫동안 기다려도 상관 없습니다. 이것은 해결책으로 나를 위해 일했을 텐데, 모순 때문에 해결책으로 이것을 사용할 수 없다.

+0

사용중인 메시지 공급자를 지정하지 않았습니다. 하지만 지금까지 많은 메시징 제공 업체가 임의의 메시지 확인을 허용하지 않는다는 것을 알고 있습니다. 하나의 메시지를 확인하면 그 시점까지 수신 된 모든 메시지도 승인되어 대기열에서 제거됩니다. – Shashi

+0

나는 apache qpid를 사용하며 임의의 승인을하지는 않지만 특정 메시지에 대해 승인을하고 있습니다. 그 전에 모든 메시지가 지워지지만 그 이상의 메시지가 수신되면 제거됩니다. – Raks

답변

4

이 게시물은 오래된 것으로 알고 있지만이 답변은 나중에 실수를하는 사람들에게 도움이됩니다. 당신이 인정하고 싶은 메시지의 세밀한 제어를 원하는 경우

individual는 방법 당신을 도움이 될 것 인정합니다. 이 승인 모드를 사용하면 세션의 개별 메시지를 확인할 수 있습니다. 승인되지 않은 메시지는 다시 전달됩니다.

이것은 사양의 일부는 아니지만 대부분의 큐 공급자는 사양 외부에서이를 지원합니다.

Oracle 더 유연성을

Message Queue는 당신이 JMS 클라이언트 인식 모드를 사용자 정의 할 수 있습니다. 클라이언트 확인 모드에서 클라이언트 은 메시지 개체의 acknowledge() 메서드를 호출하여 메시지 사용을 명시 적으로 확인합니다.

의 표준 동작이 방법은 이 메소드가 호출 된 마지막 이후 세션에서 어떤 소비자가 소비되었는지 모든 메시지를 인정하는 세션을 야기하는 것입니다. (즉, 세션에 관계없이 그들을 소비하는 사람들의 현재 메시지 이전에 확인되지 않은 메시지를 인정한다.) JMS에 의해 지정된 표준 동작 외에도

, 메시지 큐 는 당신이 모드를 클라이언트가-인정 사용할 수 있습니다 시간에 하나의 메시지를 확인하십시오.

public interface com.sun.messaging.jms.Message { 
      void acknowledgeThisMessage() throws JMSException; 
      void acknowledgeUpThroughThisMessage() throws JMSException; 
} 

ActiveMQ

하나는 다른 예를 들어 너무 유용 할 것이다 모드를 인정 상상할 수 : Message.acknowledge()가 메시지 만 인정 것 CONSUMER_ACKNOWLEDGE 특정 MessageConsumer에 올리 , 또는 CONSUMER_CHECKPOINT_ACKNOWLEDGE Message.acknowledge()는 인스턴스까지 수신 된 메시지 만 확인합니다. 메서드가 호출되었습니다.

그러나 이러한 모든 다양한 가능성을 발휘하지 않고도 은 INDIVIDUAL_ACKNOWLEDGE 모드를 추가하는 것을 고려할 수 있습니까? 이것만으로도 다중 스레드 응용 프로그램 은 필요한 동작을 얻을 수 있습니다.

connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE); 

개인적으로 QPID을 사용하지 않은, 그러나 개별 메시지의 ACK를 수 있다는 사실에 documentation hints.

Examples 
    # acknowledge all received messages 
    session.acknowledge 

    # acknowledge a single message 
    session.acknowledge :message => message 

일괄 처리 중에 수신 및 처리 된 각 메시지를 확인할 수 있습니다. 예외가 발생하면 메시지를 확인하지 마십시오.

1

해당 메시지 플러스 해당 메시지 이전에 접수 된 다른 모든 메시지를 제거하는 큐 관리자를 만들 것입니다 메시지를 인정. 아직 응용 프로그램이 수신하지 않은 메시지는 제거하지 않아야합니다. 메시지를 어떻게 확인하는지 응용 프로그램에서 확인하고 싶을 수 있습니다.

+0

문제는 소비자가받은 모든 메시지가 제거되고 해당 메시지에 의존하지 않는다는 것입니다. 나는 그 후에 더 많은 메시지를 받았을지라도 특정 메시지까지만 제거하는 것을 구현하고 싶다. 이는 일괄 적으로 메시지를 처리하고 일괄 처리가 완료 될 때마다 해당 일괄 처리까지 확인해야하기 때문에 필요합니다. 그리고이 일괄 처리는 시간이 많이 걸리므로 계속 메시지를 병렬로 수신하려고합니다. – Raks

+0

아니요, 불가능합니다. 하나의 메시지가 승인되면 수신 된 모든 메시지가 제거됩니다. 대안을 찾아야 할 수도 있습니다. – Shashi

관련 문제