2009-12-15 6 views
9

MSMQ 전송을 사용하여 WCF에서 포이즌 메시지를 처리하려고합니다.WCF MSMQ 4.0의 포이즌 메시지 처리

원본 및 독 서비스를 만들기 위해 아래 링크를 따라갔습니다.

http://msdn.microsoft.com/en-us/library/aa395218.aspx

유일한 차이점은 대신 자체 호스팅, 나는 하나의 호스트 프로젝트와 IIS에서 2 servces를 개최했다.

두 서비스의 구성은 다음과 같습니다.

<services> 
    <service behaviorConfiguration="MainMSMQWCFService.Service1Behavior" 
    name="MainMSMQWCFService.OrderProcessorService"> 
    <endpoint address="net.msmq://localhost/private/servicemodelsamplespoison" 
     binding="netMsmqBinding" bindingConfiguration="PoisonBinding" 
     contract="MainMSMQWCFService.IOrderProcessor" /> 
    </service> 
    <service behaviorConfiguration="MainMSMQWCFService.PoisonHandlingServiceBehavior" 
    name="MainMSMQWCFService.PoisonHandlingService"> 
    <endpoint address="net.msmq://localhost/private/servicemodelsamplespoison;poison" 
       binding="netMsmqBinding" 
       bindingConfiguration="PoisonBinding2" 
       contract="MainMSMQWCFService.IOrderProcessor"> 
    </endpoint> 
    </service> 
</services> 

두 서비스가 모두 올바르게 실행되고 있습니다.

메시지가 포이즌 큐에 넣어 졌을 때 포이즌 서비스가 메시지를 처리하지 못하는 것이 문제입니다. 포이즌 큐의 메시지를 보았을 때 원래 서비스로만 타겟팅됩니다. 독약이 어떻게 처리 할 수 ​​있니? MSDN을 살펴본 후 WCF 채널이 서비스 동작 특성을 설정하여이 문제를 처리한다는 것을 알아야합니다. 다음 파라 글라도 똑같이 설명합니다.

"포이즌 메시지 큐의 메시지는 메시지를 처리하는 서비스로, 포이즌 메시지 서비스 끝점과 다를 수 있습니다. 따라서 포이즌 메시지 서비스가 큐에서 메시지를 읽으면 WCF 채널 계층은 끝점의 불일치를 발견하고 메시지를 디스패치하지 않습니다.이 경우 메시지는 주문 처리 서비스로 전달되지만 포이즌 메시지 서비스에서 수신됩니다. 메시지가 처리 된 경우에도 메시지를 계속 수신하려면 다른 끝점으로 보내려면 메시지 기준 주소가 일치하는 주소를 필터링해야하는 ServiceBehavior를 추가해야합니다.이 메시지는 포이즌 메시지 큐에서 읽은 메시지를 성공적으로 처리하는 데 필요합니다. "

하지만 내 독약이 중독 된 메시지를 처리하지 못하고 있습니까?

문제를 파악할 수 없습니다.

+0

흠, IIS에서 http 바인딩 만 호스팅 할 수 있습니다. WAS를 의미합니까? –

답변

4

동일한 문제가 있습니다.

IIS에서 netMsmq 서비스를 호스팅 할 때 대기열 이름이 서비스 이름과 일치해야하기 때문에 궁금합니다. 초기 메시지 대기열의 경우 이것은 OK입니다 (예 : 대기열이 private/SimpleService/Service1.svc와 같음). 그러나 포이즌 대기열은 private/SimpleService/Service1.svc라고 불립니다. 포이즌 서비스 이름과 일치해야합니다.

셀프 호스팅 할 때 샘플이 정상적으로 작동했습니다. 이 문제는 IIS 호스팅과 관련된 것 같습니다. 이 문제가 있다면, 내가 두려워 해결책이 없다

...

업데이트 :

이 코멘트

http://msdn.microsoft.com/en-us/library/ms789042(v=VS.90).aspx

문제가 같은 것을 제안합니다에서 나는 생각했다 :

"시스템 대기열의 메시지 (예 : system-wid)를 기반으로 WAS 호스트 응용 프로그램을 활성화 할 수 없습니다. e 데드 - 레터 큐 또는 포이즌 서브 - 큐와 같은 서브 - 큐.이것은 내가 그것을 다른 사용자 지정 포이즌 메시지 큐를 지정할 수 있습니다 생각하지 않는다 제품 "

이 버전에 대한 제한, 그래서 대안은 다음과 같습니다

1)에 서비스 구현에 코드를 작성 실패시 대체 대기열로 메시지 이동 2) 트리거를 사용하여 포이즌 메시지 대기열에서 다른 대기열로 메시지 전송 및 IIS 호스트 서비스가 수신 대기하도록 3) IIS

대신 사용자 정의 EXE에서 포이즌 메시지 서비스 호스팅
+0

Microsoft는 ** 사용자 지정 포이즌 메시지 큐 ** 기능을 net.msmq 바인딩에 추가해야합니다. –

2

최근 IIS7에서이 문제가 발생했습니다. 예, 기본적으로 WAS에서 호스팅되는 응용 프로그램은 포이즌 큐에서 작동하지 않습니다. 그러나 포이즌 메시지를 탐지하는 IIS에서 WCF 서비스를 호스트하는 방법이 있습니다. 내가 생각하는 방식은 포이즌 메시지 서비스가 주 WCF 서비스의 서브 서비스이며, 주 서비스에 의존하는 것입니다. WCF에서 하위 서비스를 호스팅하기 위해 사용자 정의 ServiceHostFactory를 구현했습니다. ServiceHostFactory 내부에서 주 서비스 호스트의 OnOpening 및 OnClosing 이벤트를 재정 의하여 포이즌 메시지 서비스를 열고 닫습니다. 그 후

public class HostFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     SomeServiceHost host = new SomeServiceHost(serviceType, baseAddresses); 
     host.PoisonMsmqServiceType = typeof(PoisonHandler); 
     return host; 
    } 
} 

public class SomeServiceHost : ServiceHost 
{ 
    private ServiceHost poisonMsmqServiceHost; 


    public Type PoisonMsmqServiceType { get; set; } 

    public SomeServiceHost(Type serviceType, params Uri[] baseAddresses) 
    : base(serviceType, baseAddresses) { } 

    protected override void OnOpening() 
    { 
     base.OnOpening(); 

     if (this.PoisonMsmqServiceType != null) 
     { 
      this.poisonMsmqServiceHost = new ServiceHost(this.PoisonMsmqServiceType); 
      this.poisonMsmqServiceHost.Open(); 
     } 
    } 

    protected override void OnClosing() 
    { 
     base.OnClosing(); 

     if (this.poisonMsmqServiceHost != null) 
     { 
      this.poisonMsmqServiceHost.Close(); 
      this.poisonMsmqServiceHost = null; 
     } 
    } 
} 

당신이 당신의 사용자 정의 호스트 팩토리 클래스와 파일 SVC는 그것이 당신을 위해 처리 포이즌 메시지의주의를 기울여야에 단지 '공장'속성을 설정 : 다음은 샘플 코드입니다.

관련 문제