1

我已经运行 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 中实现了一个网络花园。这是当您将工作进程的数量增加到超过 1 时。它通过旋转站点的多个副本为您获得一些性能。这就是问题所在。

Masstransit 只允许每个队列有一个实例,并且自从我们创建了我们的网络花园以来,消息传递就间歇性地停止工作。我猜它有时会起作用,因为我很幸运能够通过主动访问队列来访问站点实例。

但是就像我之前提到的,队列无论如何都没用,我从不使用它来接收任何东西。我想知道是否有某种方法可以将其转换为仅发送总线,在那里我发布消息但从不接收它们?

在短时间内,我在队列名称的末尾添加了一个 Guid.NewGuid(),它确实开始工作了。唯一的问题是每次我们重新启动站点时它都会创建 10 个新队列。这显然不是真正的永久解决方案。

4

1 回答 1

2

拥有总线的好处是您的发件人可以不知道收件人,而只需使用 bus.Publish()。

如果这是您想要的特性,您可能需要考虑设置瞬态队列(尽管可能仅适用于 RabbitMQ 传输)。

如果了解您的消费者不是什么大不了的事,那么您绝对可以不用总线,只需使用 EndpointCacheFactory (确保它是单例):

var endpointCache = EndpointCacheFactory
                .New(x => x.UseMsmq())

并获取您的 IEndpoint:

var targetEndpoint = endpointCache.GetEndpoint(new Uri(targetAddress)))

然后使用 .Send() 就可以了。

于 2013-06-27T11:47:58.947 回答