我正在实施服务总线并查看MassTransit。我的模式不是发布/订阅,而是发件人/接收器,其中接收器可以脱机并在以后重新联机。 现在我开始编写测试来验证MassTransit是否使用以下代码成功传递了消息:
bus = ServiceBusFactory.New(sbc =>
{
sbc.UseMsmq(
cfg =>
{
cfg.Configurator.UseJsonSerializer();
cfg.Configurator.ReceiveFrom("msmq://localhost/my_queue");
cfg.VerifyMsmqConfiguration();
});
});
然后我抓住公共汽车并发布这样的信息:
bus.Publish<TMessage>(message);
正如我从MSMQ可以看到的那样,创建了两个队列并且发送了消息,导致Mass Transit没有引发任何错误,但我在队列容器中找不到任何消息。
我做错了什么?
更新 阅读Mass Transit新闻组我发现,在Sender / Receiver的情况下,接收者可以在以后的任何时间上线,该消息可以发送使用此代码:
bus.GetEndpoint(new Uri("msmq://localhost/my_queue")).Send<TMessage>(message);
在我的场景中,我没有写发布者/订阅者,而是发件人/接收者。
答案 0 :(得分:7)
首先,要发送,您可以使用简单的EndpointCacheFactory而不是ServiceBusFactory ...
var cache = EndpointCacheFactory.New(x => x.UseMsmq());
从缓存中,您可以按地址检索端点:
var endpoint = cache.GetEndpoint("msmq://localhost/queue_name");
然后,您可以使用端点发送消息:
endpoint.Send(new MyMessage());
要接收,您将按照上面的指定创建一个总线实例:
var bus = ServiceBusFactory.New(x =>
{
x.UseMsmq();
x.ReceiveFrom("msmq://localhost/queue_name");
x.Subscribe(s => s.Handler<MyMessage>(x => {});
});
完成接收者进程后,请在IServiceBus实例上调用Dispose
。发布者关闭后,请在IEndpointCache实例上调用Dispose
。
不要丢弃单个端点(IEndpoint
)实例,缓存会保留它们供以后使用,直到它被丢弃为止。