2010-08-25 2 views
6

En utilisant la version 2.0.0.1219Impossible d'obtenir l'auto hôte pour travailler sur NServiceBus

Je cherche à la fois auto hôte un abonné et éditeur avec NServiceBus et VS2010. Les programmes s'exécutent et s'initialisent mais je n'arrive pas à faire passer les messages. L'éditeur agit comme s'il publiait, sans erreurs, mais l'abonné ne reçoit rien.

Voici la configuration abonné

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core"/> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/> 
    </configSections> 

    <!-- in order to configure remote endpoints use the format: "[email protected]" 
     input queue must be on the same machine as the process feeding off of it. 
     error queue can (and often should) be on a different machine. 
    --> 

    <MsmqTransportConfig InputQueue="loads" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5"/> 

    <UnicastBusConfig> 
    <MessageEndpointMappings> 
     <add Messages="NServiceMessage" Endpoint="loads"/> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 

Et la configuration de l'éditeur

<?xml version="1.0"?> 
<configuration> 

    <configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core"/> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/> 
    </configSections> 

    <MsmqTransportConfig InputQueue="loads" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5"/> 

    <UnicastBusConfig DistributorControlAddress="" DistributorDataAddress="" ForwardReceivedMessagesTo=""> 
    <MessageEndpointMappings> 
     <!-- publishers don't need to set this for their own message types --> 
     <!--<add Messages="Messages" Endpoint="messagebus" />--> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 

    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 

</configuration> 

Voici le code d'éditeur:

class Program 
{ 
    private static IBus _serviceBus; 

    static void Main(string[] args) 
    { 
     _serviceBus = Configure.With() 
      .Log4Net() 
      .DefaultBuilder() 
      .XmlSerializer() 
      .MsmqSubscriptionStorage() 
      .MsmqTransport() 
      .UnicastBus() 
      .LoadMessageHandlers() 
      .CreateBus() 
      .Start(); 

     while (true) 
     { 
      Console.WriteLine("Press a key to send data."); 
      Console.ReadKey(); 
      SendMessaage(); 
     } 
    } 


    private static void SendMessaage() 
    { 
     LoadMessage message = GetNextMessage(); 
     _serviceBus.Publish(message); 
    } 

    private static LoadMessage GetNextMessage() 
    { 
     LoadMessage result = new LoadMessage(); 

     result.DeliveryDate = DateTime.Today.AddDays(3).ToShortDateString(); 
     result.DestinationCity = "Boise"; 
     result.DestinationCountry = "USA"; 
     result.DestinationState = "ID"; 
     result.EventId = Guid.NewGuid(); 
     result.Time = DateTime.Now.ToUniversalTime(); 
     result.OriginState = "OR"; 
     result.OriginCity = "Portland"; 
     result.OriginCountry = "USA"; 
     result.EquipmentID = 3; 

     return result; 
    } 
} 

Et le code d'abonné

class Program 
{ 
    private static IBus _serviceBus; 
    private static LoadMessageHandler _messageHandler; 

    static void Main(string[] args) 
    { 
     _messageHandler = new LoadMessageHandler(); 

     _serviceBus = Configure 
      .With() 
      .Log4Net() 
      .DefaultBuilder() 
      .BinarySerializer() 
      .MsmqSubscriptionStorage() 
      .MsmqTransport() 
      .UnicastBus() 
      .LoadMessageHandlers() 
      .CreateBus() 
      .Start(); 

     Console.ReadKey(); 
    } 
} 

Et le code message de

public class LoadMessageHandler : IHandleMessages<LoadMessage> 
{ 
    public void Handle(LoadMessage message) 
    { 
     Console.WriteLine(String.Format("GUID: {0}", message.EventId)); 
    } 
} 
+0

Un code plus complet, comprenant des espaces de noms et des DLLs, est requis pour déterminer la cause de ce problème. NServiceMessage dans fait référence à la DLL où le type LoadMessage est défini. – Cirdec

Répondre

5

Plus de problèmes:

1: Le transport MSMQ doit être configuré comme transactionnel pour l'éditeur d'accepter les messages d'abonnement. Voir http://blogs.planbsoftware.co.nz/?p=234 pour un exemple de configuration de ceux-ci. 2: Publisher utilise XmLSerializer et l'abonné utilise BinarySerializer, ce qui les rend incompatibles.

+0

Merci, ça l'a fait, c'est la deuxième moitié de ce que j'ai eu tort. – Steve

5

Vous semblez utiliser la même file d'attente d'entrée pour les deux points de terminaison, déplacez-vous abonné à sa propre file d'attente et voir si cela fonctionne.

La configuration d'un stockage d'abonnement pour votre abonné n'est pas nécessaire car c'est l'éditeur qui est chargé de stocker les informations d'abonnement.

Espérons que cela aide!

+0

Merci, c'est la première moitié de ce que j'ai eu tort. – Steve

Questions connexes