selfhost 和 NServiceBus.host 之间的 NServiceBus 通信

发布于 2024-12-20 11:32:27 字数 3152 浏览 2 评论 0原文

我是 NServiceBus 世界的新手。我创建了一个新的 NServiceBus 项目,其中包含发送/接收 NServiceBus“客户端”、向控制台应用程序发送消息的命令以及发送/接收 selfhost(控制台应用程序)。

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

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());
    }
}

可以有人分享示例代码,我如何处理从客户端到我的 selfhost 控制台应用程序中的 Startup 方法的消息?预先非常感谢您!

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

Debug NServiceBus.Unicast.UnicastBus [(null)] <> - 调用“HandleBeginMessage” 在 NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule 上

调试 NServiceBus.Unicast.UnicastBus [(null)] <> - 已收到 消息 SpecimenTrackBus.TrackRouteManager.InternalMessages.RouteMessageReceived, SpecimenTrackBus.TrackRouteManager.InternalMessages,版本=1.0.0.0,文化=中性, PublicKeyToken=null,ID 为 .###.. 来自发件人 OrderManagement@DavisBLptp

调试 NServiceBus.Unicast.UnicastBus [(null)] <>消息处理完毕。

调试 NServiceBus.Unicast.UnicastBus [(null)] <> - 调用“HandleEndMessage” NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule

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

I am new to the NServiceBus world. I have created a new NServiceBus Project with a Send/Receive NServiceBus "client", a command which sends a message to the console app, and a send/receive selfhost (console application).

I run the service bus "client" via NServiceBus.Host.exe. I can submit messages via the following code:

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

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

I send a test message from another cs file within the client bus:

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);
        }
    }
}

My selfhost bus initilization looks like this:

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();
    }
}

I have a message handler in the selfhost console that never receives the message from the client:

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

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

Can someone share example code how I might handle the messages from my client to the Startup method in my selfhost console app? Thank you very much in advance!

UPDATE:
When I send a message from my send/receive NServiceBus.Host (client) to my selfhost bus (server), I receive the following messages:

Debug NServiceBus.Unicast.UnicastBus [(null)] <> - Calling 'HandleBeginMessage'
on NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule

Debug NServiceBus.Unicast.UnicastBus [(null)] <> - Received
message SpecimenTrackBus.TrackRouteManager.InternalMessages.RouteMessageReceived,
SpecimenTrackBus.TrackRouteManager.InternalMessages, version=1.0.0.0, Culture=neutral,
PublicKeyToken=null with ID .###.. from sender OrderManagement@DavisBLptp

Debug NServiceBus.Unicast.UnicastBus [(null)] <> Finished handling message.

Debug NServiceBus.Unicast.UnicastBus [(null)] <> - Calling 'HandleEndMessage' on
NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule

Looks like a message could actually be handled, however, my RouteMessageReceivedHandler is never called. I start each application via its own exe file. Could it be a threading issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野生奥特曼 2024-12-27 11:32:27

您的配置中缺少对 .LoadMessageHandlers() 的调用

You're missing a call to .LoadMessageHandlers() in your configuration

北恋 2024-12-27 11:32:27

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

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

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

Where do you keep your msmq transport configuration? When using the initialization code like this, you will need to provide configuration for the MsmqTransport. In the application config file you need to add lines:

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

<MsmqTransportConfig 
    InputQueue="MyQueue" 
    NumberOfWorkerThreads="1" 
    MaxRetries="5"
    ErrorQueue="error" 
  />
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文