selfhost 和 NServiceBus.host 之间的 NServiceBus 通信
我是 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的配置中缺少对 .LoadMessageHandlers() 的调用
You're missing a call to .LoadMessageHandlers() in your configuration
您将 msmq 传输配置保存在哪里?当使用这样的初始化代码时,您需要为 MsmqTransport 提供配置。在应用程序配置文件中,您需要添加以下行:
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: