【问题标题】:MassTransit 3 responding with listMassTransit 3 响应列表
【发布时间】:2015-11-04 22:20:08
【问题描述】:

我在请求-响应模型中遇到 MassTransit 问题(使用 MassTransit.RabbitMQ 3.0.14)。

TLDR;当响应类型为 List/IEnumerable 时,Request-Respond 不起作用。

在客户端我正在创建 IRequestClient 的实例:

var RequestObjects = busControl.CreateRequestClient<MyObjectsRequest, List<MyObject>>(
                    new Uri(configuration["MassTransit:ServerAddress"] + "/" + configuration["MassTransit:TestQueueName"]),
                    TimeSpan.FromSeconds(15));

接下来,我调用服务器进行响应:

RequestObjects.Request(new MyObjectsRequest{ Id = 1 });

在服务器端我已经注册了消费者:

public async Task Consume(ConsumeContext<MyObjectRequest> context)
{
      var myList = new List<MyObject>
      {
            new MyObject { Id = 1 },
            new MyObject { Id = 2 }
      }
      context.Respond(myList);
}

问题是响应转到了一些临时的 _skipped 队列(我正在通过 RabbitMQ 的 Web 面板跟踪它)并且我收到 RequestTimeOutException。 我也试过IEnumerable&lt;&gt; - 同样的事情。

事实上,Array&lt;MyObject&gt; 运作良好 - 响应会返回给我的客户。

当我使用 MassTransit 2.x 订阅列表时,AFAIR 运行良好。是否有可能在 MassTransit 3.x 上做同样的事情?

奇怪的是,当我使用 List/IEnumerable 时,消息类型在到达 RabbitMQ 时似乎被删除了:

单个对象发送时messageType的sn-p:

以及发送对象数组时messageType的sn-p:

【问题讨论】:

    标签: c# masstransit


    【解决方案1】:

    使用数组绝对比List&lt;T&gt;IEnumerable&lt;T&gt; 更受欢迎——原因不同。数组是不可变的(通常,无论如何),通常不能修改。

    话虽如此,我很确定如果您使用的是 JSON、BSON 或 XML,您提到的所有签名都应该有效。相关的代码行是https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit/Serialization/JsonConverters/ListJsonConverter.cs#L59——显然ListIEnumerable都存在。

    你有失败的单元测试吗?如果有,可以分享一下吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多