2012-09-05 10 views
5

Soy nuevo en NServiceBus y estoy tratando de desarrollar un editor y un suscriptor separado (estoy usando v3.2.0.0) que, hasta ahora, está trabajando ok, tanto el publicador como el suscriptor se están ejecutando en el host NServiceBus. Mis mensajes todo publican bien, pero de forma intermitente que no son recogidas por el abonado, con el siguiente error que se muestra por el editor:NServiceBus Advertencia "No se encontraron controladores para el tipo de mensaje"

2012-09-05 14:27:37,491 [Worker.6] WARN NServiceBus.Unicast.UnicastBus [(null)] <(null)> - No handlers could be found for message type: MyNamespace.MyMessage 

Esta advertencia no aparece para todos los mensajes, así que si sigo editorial mensaje tras mensaje podría ver la mitad de ellos mostrando el mensaje y, por lo tanto, no ser recogido por el suscriptor, aunque todos están apareciendo en la cola de MSMQ.

Debo admitir que estoy luchando para entender esto, por lo que algunos de mis códigos hasta ahora bien pueden ser basura completa!

estoy publicando mensajes a NSB como sigue, siendo la entrada de mensaje de uno de varios tipos diferentes he definido:

private void Publish<T>(T message) 
{ 
    var myBus = Configure.Instance.Builder.Build<IBus>(); 
    myBus.Publish(message); 
} 

El EndpointConfig del editor es como sigue:

[EndpointName("MyQueue")] 
public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher, IWantCustomInitialization 
{ 
    /// <summary> 
    /// Initialisation for NServiceBus. 
    /// </summary> 
    public void Init() 
    { 
     Configure.With() 
      .DefaultBuilder() 
      .MsmqSubscriptionStorage() 
      .DisableTimeoutManager() 
      .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MyNamespace")); 
    } 
} 

En el lado del suscriptor tengo el siguiente EndpointConfig:

[EndpointName("MyQueue")] 
public class EndPointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 
{ 
    public void Init() 
    { 
     Configure.With() 
      .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MyNamespace")); 
    } 
} 

Con una EventMessageHandler de la siguiente manera: app.config

public class EventMessageHandler : IEvent, IHandleMessages<IMyMessage> 
{ 
    public void Handle(IMyMessage message) 
    { 
     Console.WriteLine(string.Format("Subscriber 1 received EventMessage with Id {0}.", message.Id)); 
    } 
} 

del suscriptor es:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" /> 
    </configSections> 

    <MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/> 

    <UnicastBusConfig> 
    <MessageEndpointMappings> 
     <add Messages="MyNamespace" Endpoint="MyQueue" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 
</configuration> 

Respuesta

8

Parece que está utilizando el mismo nombre de extremo, tanto para su editor y el suscriptor. NServiceBus usa el nombre del punto final para generar los nombres de la cola, por lo que significa que ambos procesos terminan usando la misma cola.

De modo que su editor está publicando mensajes, pero luego el editor y el suscriptor están peleándose por quién los procesará.

Cuando el suscriptor gana, usted ve su comportamiento previsto.

Cuando el publicador gana, no hay controlador para ese mensaje, por lo que NServiceBus muestra una advertencia. Esto no siempre es un problema; hay ciertos escenarios en los que desearía recibir y simplemente ignorar un mensaje, pero esta advertencia le permite al menos saber que está sucediendo, y en su caso, significa que el mensaje no está siendo procesado por la aplicación prevista.

Para solucionarlo, simplemente cambie los nombres de los puntos finales. MySubscriber y MyPublisher, o algo así.

Ni siquiera necesita usar ese atributo, solo puede nombrar la clase que implementa IConfigureThisEndpoint y NServiceBus construirá el nombre del punto final en función de eso. Incluso puede usar guiones bajos como MyProject_MyPublisher : IConfigureThisEndpoint y NServiceBus convertirá los guiones bajos en puntos, por lo que obtendrá una cola de entrada de "MyProject.MyPublisher", lo cual es realmente bueno para el espacio de nombres cuando tiene muchos puntos finales corriendo.

+0

Gracias David, había asumido erróneamente que el punto final tenía que ser el mismo para señalar al suscriptor en la fila correcta, pero lo que dijiste tiene sentido.Todavía recibo el mensaje de advertencia del editor (para cada mensaje ahora), pero todos los mensajes están siendo recogidos por el suscriptor, así que estoy contento con eso. Gracias :) – RichardB

+0

De hecho, ignore mi comentario sobre las advertencias que siguen apareciendo, borré todos los mensajes en MyQueue.Subscriptions (había 3 allí) y ahora está funcionando perfectamente. – RichardB

Cuestiones relacionadas