如何在控制台应用程序中创建发布者

时间:2010-10-06 13:04:45

标签: c# console-application nservicebus

我刚开始使用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中托管发布者时,我错过了哪些步骤?

要创建控制台应用程序,我已完成以下操作:

  1. 在pubsub解决方案中,创建了一个控制台应用程序。
  2. 在控制台应用程序中添加了对mymessages,nservicebus.dll和nservicebus.core.dll的引用
  3. 从NServiceBus网站上现有的酒吧代码和示例中,将以下代码添加到“Main()”
  4. 代码:

    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);
    
    1. 使用现有“publisher”app.config的内容为新的控制台应用程序创建了一个app.config。

    2. 为控制台应用程序项目的命令行参数添加了“NServiceBus.Integration”。

1 个答案:

答案 0 :(得分:1)

如果查看日志,NServiceBus可能会告诉您需要将发布者配置为事务性。这样做的方法是在.MsmqTransport()之后包含.IsTransactional(true)。