selfhost和NServiceBus.host之间的NServiceBus通信

时间:2011-12-10 20:48:17

标签: c# nservicebus

我是NServiceBus世界的新手。我创建了一个新的NServiceBus项目,它带有一个Send / Receive NServiceBus“client”,一个向控制台app发送消息的命令,以及一个发送/接收selfhost(控制台应用程序)。

我通过NServiceBus.Host.exe运行服务总线“client”。我可以通过以下代码提交消息:

public class OrderMessaging
{
    public IBus Bus { get; set; }

    public void SendRouteMessageReceived(LabRoutingUpdateMessage routingUpdateMessage)
    {
        Bus.Send(new RouteMessageReceived(routingUpdateMessage));
    }
}

我从客户端总线中的另一个cs文件发送测试消息:

class OrderManagementTest : IWantToRunAtStartup
{
    public IBus _bus { get; set; }

    public void Run()
    {
        Console.WriteLine("Press 'Enter' to send a message.To exit, Ctrl + C");

        while (Console.ReadLine() != null)
        {
            Int64 _trackNum = 999245;

            Console.WriteLine("Track Number: {0}", _trackNum.ToString());

            _labRouteMessage = new LabRoutingUpdateMessage(_trackNum);

            OrderMessaging Message = new OrderMessaging();
            Message.Bus = _bus;
            Message.SendRouteMessageReceived(_labRouteMessage);
        }
    }
}

我的selfhost总线启动如下:

public static class Startup 
{
    static void Main(string[] args)
    {
        // Setup the bus
        BusInitializer.Init();
        Console.Clear();
        Console.ReadLine();  //need to handle messages here from the client 
    }
}

public class BusInitializer 
{
    public static IBus Bus { get; private set; }

    public static void Init()
    {
        Bus = NServiceBus.Configure.With()
            .Log4Net()
            .DefaultBuilder()
            .XmlSerializer()
            .MsmqTransport()
                .IsTransactional(false)
                .PurgeOnStartup(false)
            .UnicastBus()
                .ImpersonateSender(false)
            .CreateBus()
            .Start();
    }
}

我在selfhost控制台中有一个消息处理程序,它从不接收来自客户端的消息:

public class RouteMessageReceivedHandler : IHandleMessages<RouteMessageReceived>
{
    public void Handle(RouteMessageReceived message)
    {
        Trace.TraceInformation(message.GetType().Name);

        Console.Write("you received a message!!" + message.ToString());
    }
}

有人可以共享示例代码,我可以在自我主机控制台应用程序中处理从客户端到Startup方法的消息吗?非常感谢你提前!

更新: 当我从发送/接收NServiceBus.Host(客户端)发送消息到我的selfhost总线(服务器)时,收到以下消息:

调试NServiceBus.Unicast.UnicastBus [(null)]&lt;&gt; - 调用'HandleBeginMessage'     在NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule

调试NServiceBus.Unicast.UnicastBus [(null)]&lt;&gt; - 收到了     消息SpecimenTrackBus.TrackRouteManager.InternalMessages.RouteMessageReceived,     SpecimenTrackBus.TrackRouteManager.InternalMessages,version = 1.0.0.0,Culture = neutral,     PublicKeyToken = null,ID为。### ..来自发件人OrderManagement @DavisBLptp

调试NServiceBus.Unicast.UnicastBus [(null)]&lt;&gt;完成处理消息。

调试NServiceBus.Unicast.UnicastBus [(null)]&lt;&gt; - 调用'HandleEndMessage'     NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule

看起来实际上可以处理消息,但是,我的RouteMessageReceivedHandler永远不会被调用。我通过自己的exe文件启动每个应用程序。这可能是一个线程问题吗?

2 个答案:

答案 0 :(得分:2)

您在配置中错过了对.LoadMessageHandlers()的调用

答案 1 :(得分:0)

您在哪里保留msmq传输配置?使用这样的初始化代码时,您需要提供MsmqTransport的配置。在应用程序配置文件中,您需要添加行:

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

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