我刚开始使用nservicebus,并更新了pubsub示例以使用.NET 4.0框架。工作得很好。这在“nserviceus.host.exe”环境中运行一个发布服务器和两个订阅服务器,因此负责设置总线实例和执行任何相关订阅。这一切都很好(如您所料),但我现在正试图将发布服务器从运行在“nservicebus.host.exe”中转移到它自己的控制台应用程序中(最终,我希望发布来自某个网站的消息,因此这似乎是朝着这个方向迈出的一小步)。
如果启动3个项目(我的控制台应用程序、sub1和sub2),它会在本地计算机上创建5个msmq,但不会创建endpoint.config…subscriptions q,而是创建一个通用的“nserviceus订阅”q。如果启用日志,我会看到myPublisherInputQueue有三条(已处理)完成消息,错误代码为0,而subscriptor1inputqueue和subscriber2inputqueue各有一个。这一切似乎都很好,但是如果我再发布消息,发布者似乎不会抛出任何错误,但是对于订阅者来说,没有任何消息能够做到这一点(他们只是坐在那里等待消息)。对于任何MQS,新消息或日志中都不会显示任何消息。
很明显,我遗漏了一些步骤——控制台应用程序是否没有为订阅打开自己?如果是这样,需要采取什么步骤来做到这一点?当您在nservicebus.host.exe中宿主发布服务器时,我缺少哪些步骤?
要创建控制台应用程序,我已完成以下操作:
-
在pubsub解决方案中,创建了一个控制台应用程序。
-
在控制台应用程序中添加了对mymessages、nservicebus.dll和nservicebus.core.dll的引用
-
从nservicebus网站上现有的pub代码和示例中,将以下代码添加到“main()”
代码:
IBus Bus = Configure.With()
.Log4Net()
.DefaultBuilder()
.MsmqSubscriptionStorage()
.XmlSerializer()
.MsmqTransport()
.UnicastBus()
.LoadMessageHandlers()
.CreateBus()
.Start();
bool publishIEvent = true;
do
{
Console.ReadLine();
var eventMessage = publishIEvent ? Bus.CreateInstance<IEvent>() : new EventMessage();
eventMessage.EventId = Guid.NewGuid();
eventMessage.Time = DateTime.Now.Second > 30 ? (DateTime?)DateTime.Now : null;
eventMessage.Duration = TimeSpan.FromSeconds(99999D);
Bus.Send(eventMessage);
Console.WriteLine("Published event with Id {0}.", eventMessage.EventId);
} while (true);
-
使用现有“publisher”app.config的内容为新控制台应用程序创建了app.config。
-
为控制台应用程序项目的命令行参数添加了“nservicebus.integration”。