我一直在运行masstransit / msmq一段时间没有问题,使用它从asp.net mvc应用程序向windows服务发送消息。
我的全局asax在OnApplicationStarted事件中包含以下内容:
MessageBus = ServiceBusFactory.New(sbc =>
{
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.UseMulticastSubscriptionClient();
sbc.ReceiveFrom("msmq://localhost/websiteQueue");
sbc.Subscribe(subs =>
{
});
});
请注意,此总线配置为仅发送消息,它不接收任何内容。这很重要。
最近我们在IIS中实现了一个Web园。这是当你将工作进程数增加到1以上时。通过激活站点的多个副本可以获得一些性能。这就是问题所在。
Masstransit只允许每个队列的单个实例,自从我们创建了我们的Web园区以来,消息传递已经停止了间歇性工作。我猜它有时会起作用,因为我很幸运能够通过主动访问队列来点击该网站的实例。
但就像我之前提到的那样,队列无论如何都是无用的,我从不用它来接收任何东西。我想知道是否有某种方法可以将其转换为仅发送总线,我发布消息但从未接收过它们?
在短时间内,我在队列名称的末尾添加了一个Guid.NewGuid(),它确实开始工作了。唯一的问题是每次重新启动站点时都会创建10个新队列。这显然不是一个永久的解决方案。
答案 0 :(得分:2)
拥有总线的好处是发件人可能不知道收件人,只需使用bus.Publish()。
如果这是一个理想的特性,您可能需要考虑设置瞬态队列(仅限RabbitMQ传输可用)。
如果你知道你的消费者并不是什么大不了的事情那么你绝对可以做公共汽车,只需使用EndpointCacheFactory(确保它是单身):
var endpointCache = EndpointCacheFactory
.New(x => x.UseMsmq())
获取你的IEndpoint:
var targetEndpoint = endpointCache.GetEndpoint(new Uri(targetAddress)))
然后在它上面使用.Send()。