2012-10-10 3 views
1

현재 nServiceBus에서 호스팅되는 응용 프로그램을 실행하기 위해 고심하고 있습니다. 타사에서 메시지를 게시하는 하늘색 ServiceBus 대기열이 있으며이 메시지를 수신하기 위해 내 애플리케이션 (현재 로컬에서 호스팅 됨)을 원합니다.Azure ServiceBus 큐에서 메시지를 수신하는 전제 NServicebus 응용 프로그램에서

나는 끝점을 구성하는 방법에 대한 해답을 찾기 위해 봤지만 유효한 설정에는 운이 없었습니다. Azure 저장소 대기열에 연결하는 방법에 대한 예제를 찾을 수 있지만 서비스 버스 대기열에 대한 예제는 찾을 수 없었습니다. (나는 다른 이유로 푸른 servicebus 큐 필요)

내가 가진 설정은

public void Init() 
    { 
     Configure.With() 
      .DefaultBuilder() 
      .XmlSerializer() 
      .UnicastBus() 
      .AzureServiceBusMessageQueue() 
      .IsTransactional(true) 
      .MessageForwardingInCaseOfFault() 
      .UseInMemoryTimeoutPersister() 
      .InMemorySubscriptionStorage(); 
    } 

다음과 같다. 메시지 = 엔드 포인트를 시작할 때 예외가 발생했습니다. 오류가 기록됩니다. 이유 : 입력 큐 [mytimeoutmanager에서 @의 SB : // [*] .servicebus.windows.net/=이 소스와 같은 시스템에

NServiceBus.Host

이어야한다.

<configuration> 
    <configSections> 
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" /> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    <section name="AzureServiceBusQueueConfig" type="NServiceBus.Config.AzureServiceBusQueueConfig, NServiceBus.Azure" /> 
    <section name="AzureTimeoutPersisterConfig" type="NServiceBus.Timeout.Hosting.Azure.AzureTimeoutPersisterConfig, NServiceBus.Timeout.Hosting.Azure" /> 
    </configSections> 
    <AzureServiceBusQueueConfig IssuerName="owner" QueueName="testqueue" IssuerKey="[KEY]" ServiceNamespace="[NS]" /> 
    <MessageForwardingInCaseOfFaultConfig ErrorQueue="error" /> 
    <!-- Use the following line to explicitly set the Timeout manager address --> 
    <UnicastBusConfig TimeoutManagerAddress="MyTimeoutManager" /> 
    <!-- Use the following line to explicity set the Timeout persisters connectionstring --> 
    <AzureTimeoutPersisterConfig ConnectionString="UseDevelopmentStorage=true" /> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedruntime version="v4.0" /> 
    <requiredruntime version="v4.0.20506" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> 
    </startup> 
</configuration> 

답변

0

과 같이 전화의 끝에 UnicastBus() 이동하십시오 :

Configure.With() 
     .DefaultBuilder() 
     .XmlSerializer() 
     .AzureServiceBusMessageQueue() 
     .IsTransactional(true) 
     .MessageForwardingInCaseOfFault() 
     .UseInMemoryTimeoutPersister() 
     .InMemorySubscriptionStorage() 
     .UnicastBus(); // <- Here 

그리고 큐에 메시지를 게시하는 타사에 대한

. 그들은 how NServiceBus handles serialization/deserialization을 존중해야한다는 것을 명심하십시오.

private void Send(Byte[] rawMessage, QueueClient sender) 
    { 
     var numRetries = 0; 
     var sent = false; 

     while(!sent) 
     { 
      try 
      { 
       var brokeredMessage = new BrokeredMessage(rawMessage); 

       sender.Send(brokeredMessage); 

       sent = true; 
      } 
       // back off when we're being throttled 
      catch (ServerBusyException) 
      { 
       numRetries++; 

       if (numRetries >= MaxDeliveryCount) throw; 

       Thread.Sleep(TimeSpan.FromSeconds(numRetries * DefaultBackoffTimeInSeconds)); 
      } 
     } 

    } 

    private static byte[] SerializeMessage(TransportMessage message) 
    { 
     if (message.Headers == null) 
      message.Headers = new Dictionary<string, string>(); 

     if (!message.Headers.ContainsKey(Idforcorrelation)) 
      message.Headers.Add(Idforcorrelation, null); 

     if (String.IsNullOrEmpty(message.Headers[Idforcorrelation])) 
      message.Headers[Idforcorrelation] = message.IdForCorrelation; 

     using (var stream = new MemoryStream()) 
     { 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(stream, message); 
      return stream.ToArray(); 
     } 
    } 

당신이 NServiceBus 올바르게 메시지를 직렬화하는 경우 다음이 NServiceBus에서 수행하는 방법이다 (가장 중요한 부분은 BrokeredMessage는, 원시 메시지와 함께 경우 BinaryFormatter를 사용하여 serialziation의 결과를 초기화한다는 것입니다) thierd 파티가 올바르게 직렬화되도록하십시오.

+0

안녕하세요 Sandrino 답장을 보내 주셔서 감사합니다. 타사는 실제로 PHP 응용 프로그램이며 nservicebus에서 deserialize하려는 xml 데이터를 보낼 것입니다. 테스트 메시지를 성공적으로 보냈지 만 아직받지 못하고 deserialize합니다. –

+0

호출을 UnicastBus로 옮기려고 했습니까 끝까지? –

+0

안녕 Sandrino, 예 유니 캐스트 호출을 끝으로 이동하면 우리가 더 있지만 우리가 지금 직렬화 문제가 발생하는 것이 좋습니다 : (2012-10-10 11 : 49 : 54,004 [Worker.14] ERROR NServiceBus.Unicast.Transport.Transact ional.TransactionalTransport [(null)] <(null)> - 메시지 수신 오류. System.Runtime.Serialization.SerializationException : System.Byte [] 유형의 개체를 초기화하는 동안 오류가 발생했습니다. 입력 소스의 형식이 올바르지 않습니다. ted. ---> System.Xml.XmlException : 입력 소스의 형식이 올바르지 않습니다. –

0

이제 정확히 동일한 문제가 발생했으며 해결 방법을 알아 내는데 몇 시간을 보냈습니다. 기본적으로 Azure timeout persister는 NServiceBus.Hosting.Azure를 사용하는 Azure 호스트 된 끝점에서만 지원됩니다. NServiceBus.Host 프로세스를 사용하여 끝점을 호스팅하면 NServiceBus.Timeout.Hosting.Windows 네임 스페이스 클래스가 사용됩니다. MSMQ를 사용하여 TransactionalTransport를 초기화했으며이 메시지가 나타납니다. 당신이 As_Server 엔드 포인트 구성을 사용해야하는 경우

  1. , 당신은 당신의 초기화에 .DisableTimeoutManager()를 사용할 수 있습니다, 그것은 TimeoutDispatcher 초기화를 완전히
  2. 사용 As_Client 엔드 포인트를 건너 뜁니다 :

    나는 그것을 방지하기 위해 두 가지 방법을 사용 구성에서 전송 모드와 트랜잭션 시간을 사용하지 않습니다. 디스패처가 초기화되지 않았습니다.

Azure 타임 아웃 관리자를 어떻게 든 삽입 할 수는 있지만 아직 찾지 못했지만 lly As_Client thingy가 필요하므로 잘 작동합니다.

관련 문제