我刚开始使用NServiceBus并更新了PubSub示例以使用.NET 4.0 Framework。这工作完全正常。这在“NServiceBus.Host.exe”环境中运行一个发布者和两个订阅者 - 因此负责设置总线实例并执行任何相关订阅。这一切都正常(正如您所期望的那样)但我现在正试图将发布者从“NServiceBus.Host.exe”中运行到其自己的控制台应用程序中(最终我想从网站发布消息,以便这似乎是朝这个方向迈出的一小步)。
如果我启动3个项目(我的控制台应用程序,Sub1和Sub2),它会在我的本地计算机上创建5 msmq,但不是endpoint.config ...订阅Q,它会创建一个通用的“nservicebus_subscriptions”Q.如果我启用了日志,我看到MyPublisherInputQueue有三个(已处理的)完成消息,错误代码为0,而subscriber1inputqueue和subscriber2inputqueue各有一个。这一切似乎都很好,但如果我然后发布消息,发布者似乎不会抛出任何错误,但没有消息使其成为订阅者(他们只是等待消息)。对于任何MQ,新消息或日志中也不会出现任何消息。
我显然错过了一些步骤 - 控制台应用程序是否没有为订阅打开自己?如果是这样,需要采取哪些步骤?当您在nservicebus.host.exe中托管发布者时,我错过了哪些步骤?
要创建控制台应用程序,我已完成以下操作:
代码:
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”。
答案 0 :(得分:1)
如果查看日志,NServiceBus可能会告诉您需要将发布者配置为事务性。这样做的方法是在.MsmqTransport()之后包含.IsTransactional(true)。