2011-04-07 4 views
2

설정 한 WebSphere MQ 계약이 있습니다. 포이즌 처리를 위해 별도의 대기열에 5 번 재 시도 된 메시지를 전달하도록 대기열을 구성했습니다. WebSphere MQ v 7.01에서 제공하는 WCF 채널을 사용하여 서비스와 상호 작용합니다.WCF/MQSeries : 포이즌 메시지를 보관하는 방법

내 서비스가 연결되어 있지만 모든 것이 완벽하게 작동합니다. 서비스가 끊기 자마자 포이즌 메시지가 기본 대기열에 다시 나타납니다. 서비스를 다시 시작하면 즉시 메시지가 기본 대기열에서 포이즌 대기열로 되돌아갑니다. 서비스가 대기열에서 연결 해제 된 후 메시지가 독극물 대기열에 머물러있게하려면 어떻게해야합니까?

코드는 현재 POC 모드이므로 Window에서 서비스를 호스팅하고 있습니다. 이 클래스는 이러한 속성이 있습니다

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    [AssuredDelivery()] 
    public partial class MainWindow : Window, IWmqEndpoint 

서비스 계약은 다음과 같습니다

[ServiceContract()] 
    public interface IWmqEndpoint 
    { 
    [OperationContract(IsOneWay = true)] 
    void SendMessage(string message); 

    [OperationContract(IsOneWay = true)] 
    void SendComplex(PersonName name); 
    } 

주요 큐가 지속적이고, 그렇지 않으면 기본 설정. 독약 대기열에 대한 내용입니다.

대기열 설정 :

  1. 백 아웃 요청 큐 :
  2. wcf.inbound.poison 백 아웃 임계 값 : 5
  3. 강화 얻을 백 아웃 : 강화하지
  4. NPM 클래스 : 일반

답변

0

응용 프로그램이 작업 단위 (UOW)에서 메시지를 읽으면 WMQ는 같은 작업 단위 (UOW)에 다른 메시지가 있는지 전혀 모릅니다. 메시지가 포이즌 메시지 인 것으로 판명되면 WMQ는 다른 모든 작업 단위와 동일한 작업 단위의 백 아웃 대기열 에 큐를 다시 큐에 넣습니다.. WMQ가 작업 단위 외부로 메시지를 이동한다면 손실되거나 복제 될 수 있습니다. WMQ가 사용자를 대신하여 UOW를 커밋 한 경우 검색했지만 완전히 처리되지 않은 메시지를 커밋 할 수 있습니다. 따라서 WMQ를 사용하면 백 아웃 처리를 수행하는 경우 작업 단위간에 명시 적으로 커밋 할 수 있습니다.

메시지와 같은 동작이 syncpoint 아래 백 아웃 대기열에 보관됩니다. 응용 프로그램이 종료되면 암시 적으로 BACKOUT이 발생하고 모든 메시지가 원래 대기열로 돌아갑니다. 메시지를 백 아웃 대기열에 남겨 두려면 하나 이상의 성공적인 작업 단위가 필요합니다. 나쁜 메시지 뒤에있는 입력 대기열에 좋은 메시지를 넣은 다음 명시적인 COMMIT을 실행하십시오.

그런데 WebSphere MQ에는 지속성 큐 개념이 없습니다. 지속성은 메시지의 속성입니다. 대기열에는 메시지를 처음 만들 때 메시지를 영구적으로 만들지 여부를 알려주는 DEFPSIST 속성이 있습니다. 전달되는 대기열의 설정에 관계없이 메시지의 지속성은 WMQ 네트워크를 통해 이동함에 따라 변경되지 않습니다. 따라서 백 아웃 큐의 DEFPSIST은 메시지 지속성이 백 아웃 큐에 도달하기 전에 정의되었으므로 아무런 영향을 미치지 않습니다.

+0

은 좋은 메시지를 대기열에 넣고 시도한 다음 명시 적으로 커밋을 시도했습니다. 그것은 작동하지 않았다. 현재로서는 .NET에서 사용할 독이 메시지 처리 패턴을 평가하는 나쁜 행동을 강요합니다. –

+0

DIS QSTATUS (사용자 백엔드 qname) ALL '메시지가 백 아웃 큐에있는 동안 진행중인 작업 단위가 있는지 확인하십시오. 그렇다면'UNCOM (YES)'가 표시됩니다.이들은 커밋되지 않은 메시지 여야하며 연결 ​​핸들 당 하나의 UOW 만있을 수 있습니다. Hmmm ... 이제는 그것에 대해 생각해보십시오. 또한 DIS QSTATUS (백 아웃 qname) TYPE (HANDLE) ALL'을 실행하고 큐에 하나 이상의 스레드가 연결되어 있는지 확인하십시오. –