c# – 同一个应用程序可以同时是NServiceBus的发布者/订阅者吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 同一个应用程序可以同时是NServiceBus的发布者/订阅者吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3178字,纯文字阅读大概需要5分钟。
内容图文
![c# – 同一个应用程序可以同时是NServiceBus的发布者/订阅者吗?](/upload/InfoBanner/zyjiaocheng/795/24556abdf6e84f8f828f6c603e11f71c.jpg)
我是消息传递架构的新手,所以我可能会采用错误的方式.但我想通过解决一个小问题在我的团队中慢慢介绍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”);
按键后再次获得原始异常.
– >我通过使用原始和复制的解决方案启动2个visual studio来测试它.然后在IDE中启动两个控制台应用程序.
解决方法:
如果您希望发布者也是消息的接收者,您希望在配置中指定它.
这在this article中有明确解释,其中您的问题的解决方案完全在文章的最后.
内容总结
以上是互联网集市为您收集整理的c# – 同一个应用程序可以同时是NServiceBus的发布者/订阅者吗?全部内容,希望文章能够帮你解决c# – 同一个应用程序可以同时是NServiceBus的发布者/订阅者吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。