编程语言
首页 > 编程语言> > c# – 同一个应用程序可以同时是NServiceBus的发布者/订阅者吗?

c# – 同一个应用程序可以同时是NServiceBus的发布者/订阅者吗?

作者:互联网

我是消息传递架构的新手,所以我可能会采用错误的方式.但我想通过解决一个小问题在我的团队中慢慢介绍NServiceBus.

议程中的任命有州.两个用户可能在相同的应用程序中查看相同日程中的相同约会.他们通过中央服务器上的远程会话启动此应用程序.因此,如果用户1更新约会的状态,我希望用户2看到新状态的“实时”.

为了模拟这个或者如果你愿意做一个概念证明,我做了一个新的控制台应用程序.通过NuGet我得到了NServiceBus和NServiceBus.Host,因为我从文档中了解到我需要两者.我知道在生产代码中不建议将所有内容放在同一个程序集中,但发布者和订阅者很可能最终会在同一个程序集中…

在类Program方法Main我写了以下代码:

BusConfiguration configuration = new BusConfiguration();

configuration.UsePersistence<InMemoryPersistence>();
configuration.UseSerialization<XmlSerializer>();
configuration.UseTransport<MsmqTransport>();
configuration.TimeToWaitBeforeTriggeringCriticalErrorOnTimeoutOutages(new TimeSpan(1, 0, 0));
ConventionsBuilder conventions = configuration.Conventions();
conventions.DefiningEventsAs(t => t.Namespace != null
    && t.Namespace.Contains("Events"));

using (IStartableBus bus = Bus.Create(configuration))
{
    bus.Start();

    Console.WriteLine("Press key");
    Console.ReadKey();

    bus.Publish<Events.AppointmentStateChanged>(a =>
    {
        a.AppointmentID = 1;
        a.NewState = "New state";
    });

    Console.WriteLine("Event published.");
    Console.ReadKey();
}

在类EndPointConfig方法Customize I添加:

configuration.UsePersistence<InMemoryPersistence>();
configuration.UseSerialization<XmlSerializer>();
configuration.UseTransport<MsmqTransport>();
ConventionsBuilder conventions = configuration.Conventions();
conventions.DefiningEventsAs(t => t.Namespace != null
    && t.Namespace.Contains("Events"));

AppointmentStateChanged是Events文件夹中的一个简单类,如下所示:

public class AppointmentStateChanged: IEvent {
    public int AppointmentID { get; set; }
    public string NewState { get; set; }
}

AppointmentStateChangedHandler是事件处理程序:

public class AppointmentStateChangedHandler : IHandleMessages<Events.AppointmentStateChanged> {
public void Handle(Events.AppointmentStateChanged message) {
        Console.WriteLine("AppointmentID: {0}, changed to state: {1}", 
            message.AppointmentID, 
            message.NewState);
    }
}

如果我启动一个控制台应用程序一切正常.我看到处理程序处理事件.但是,如果我尝试启动第二个控制台应用程序,它会崩溃:System.Messaging.MessageQueueException(请求的操作的超时已过期).所以我必须做错事,让我猜测我不了解更高层次的东西.有人能指出我正确的方向吗?

更新
Everthing位于命名空间AgendaUpdates中,但AgendaUpdates.Events命名空间中的事件类除外.

更新2
采取的步骤:

>复制的AgendaUpdates解决方案(到AgendaUpdates2文件夹)
>在副本中,我将App.Config中的MessageEndpointMappings更改为“AgendaUpdates2”的EndPoint属性
我得到了MSMQ异常:“队列不存在或者您没有足够的权限来执行操作”
>在副本中,我将这行代码添加到EndPointConfig:configuration.EndpointName(“AgendaUpdates2”);
我得到了MSMQ异常:“队列不存在或者您没有足够的权限来执行操作”
>在副本中,我将这行代码添加到Program类的Main方法中:
configuration.EndpointName( “AgendaUpdates2”);
按键后再次获得原始异常.

– &GT我通过使用原始和复制的解决方案启动2个visual studio来测试它.然后在IDE中启动两个控制台应用程序.

解决方法:

如果您希望发布者也是消息的接收者,您希望在配置中指定它.

这在this article中有明确解释,其中您的问题的解决方案完全在文章的最后.

标签:c,msmq,nservicebus
来源: https://codeday.me/bug/20190623/1271819.html