MassTransit仅发送

Raf*_*aeu 3 msmq masstransit

我正在实施服务总线并查看MassTransit.我的模式不是发布/订阅,而是发件人/接收器,其中接收器可以脱机并在以后重新联机.现在我开始编写测试来验证MassTransit是否使用以下代码成功传递了消息:

bus = ServiceBusFactory.New(sbc =>
{
    sbc.UseMsmq(
        cfg =>
        {
            cfg.Configurator.UseJsonSerializer();
            cfg.Configurator.ReceiveFrom("msmq://localhost/my_queue");
            cfg.VerifyMsmqConfiguration();
        });
});
Run Code Online (Sandbox Code Playgroud)

然后我抓住公共汽车并发布这样的消息:

bus.Publish<TMessage>(message);
Run Code Online (Sandbox Code Playgroud)

我可以从MSMQ中注意到,创建了两个队列并且发送了消息,导致Mass Transit没有引发任何错误,但我在队列容器中找不到任何消息. 在此输入图像描述

我究竟做错了什么?

更新 阅读Mass Transit新闻组我发现在发件人/收件人的情况下,接收器可以在以后的任何时间上线,可以使用以下代码发送消息:

bus.GetEndpoint(new Uri("msmq://localhost/my_queue")).Send<TMessage>(message);
Run Code Online (Sandbox Code Playgroud)

在我的场景中,我不是在写一个发布者/订阅者,而是一个发送者/接收者.

Chr*_*son 7

首先,要发送,您可以使用简单的EndpointCacheFactory而不是ServiceBusFactory ...

var cache = EndpointCacheFactory.New(x => x.UseMsmq());
Run Code Online (Sandbox Code Playgroud)

从缓存中,您可以按地址检索端点:

var endpoint = cache.GetEndpoint("msmq://localhost/queue_name");
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用端点发送消息:

endpoint.Send(new MyMessage());
Run Code Online (Sandbox Code Playgroud)

要接收,您将按照上面的指定创建一个总线实例:

var bus = ServiceBusFactory.New(x =>
{
    x.UseMsmq();
    x.ReceiveFrom("msmq://localhost/queue_name");

    x.Subscribe(s => s.Handler<MyMessage>(x => {});
});
Run Code Online (Sandbox Code Playgroud)

接收器进程完成后,调用DisposeIServiceBus实例.发布者关闭后,请调用DisposeIEndpointCache实例.

不要丢弃各个端点(IEndpoint)实例,缓存使它们可供以后使用,直到它被丢弃为止.