【问题标题】:EasynetQ bus.Subscribe not firing - throwing "messageType must not be null"EasynetQ bus.Subscribe 未触发 - 抛出“messageType must not be null”
【发布时间】:2018-06-01 18:11:34
【问题描述】:

我可以使用以下代码成功发布消息:

        using (IAdvancedBus bus = RabbitHutch.CreateBus("host=192.168.153.128:5672;username=user;password=pass").Advanced)
        {
            IExchange exchange = bus.ExchangeDeclare("milk.api", ExchangeType.Topic);
            IQueue queue = bus.QueueDeclare("milkorderqueue");
            IBinding binding = bus.Bind(exchange, queue, "#");
            bus.Publish<MilkOrderRequest>(exchange, "#", true, new Message<MilkOrderRequest>(milkOrder));
        }
        return new HttpResponseMessage(System.Net.HttpStatusCode.OK);

当我的订阅者尝试接收消息时,EasyNetQ_Default_Error_Queue 队列会增加。下面是监听器的代码:

        IBus bus = RabbitHutch.CreateBus(@"host=192.168.153.128:5672;username=user;password=pass");
        bus.Subscribe<MilkOrderRequest>("my_subscription_id", message =>
        {
            Console.WriteLine($"Order recieved: {message.Milk}.");
        }, config =>
        {
            config.WithQueueName("milkorderqueue");
        });

我也尝试了以下方法但没有成功:

        IAdvancedBus bus = RabbitHutch.CreateBus(@"host=192.168.153.128:5672;username=user;password=pass").Advanced;
        IExchange exchange = bus.ExchangeDeclare("milkshop.subscriber", ExchangeType.Topic);
        IQueue queue = bus.QueueDeclare("milkorderqueue");
        bus.Bind(exchange, queue, "#");
        bus.Consume<MilkOrderRequest>(queue, (message, info) =>
        {
            Console.WriteLine($"Order recieved: {message.Body.Milk}.");
        });

我在 Google 上找不到有关异常的答案:

messageType 不能为空

这是完整的消息:

{
   "RoutingKey":"#",
   "Exchange":"milk.api",
   "Queue":"milkorderqueue",
   "Exception":"System.AggregateException: One or more errors occurred. (messageType must not be null\r\nParameter name: messageType) ---> System.ArgumentNullException: messageType must not be null\r\nParameter name: messageType\r\n   at EasyNetQ.Preconditions.CheckNotNull[T](T value, String name, String message)\r\n   at EasyNetQ.Preconditions.CheckNotNull[T](T value, String name)\r\n   at EasyNetQ.MessageFactory.CreateInstance(Type messageType, Object body, MessageProperties properties)\r\n   at EasyNetQ.RabbitAdvancedBus.<>c__DisplayClass17_0.<Consume>b__0(Byte[] body, MessageProperties properties, MessageReceivedInfo messageReceivedInfo)\r\n   at EasyNetQ.Consumer.HandlerRunner.InvokeUserMessageHandler(ConsumerExecutionContext context)\r\n   --- End of inner exception stack trace ---\r\n---> (Inner Exception #0) System.ArgumentNullException: messageType must not be null\r\nParameter name: messageType\r\n   at EasyNetQ.Preconditions.CheckNotNull[T](T value, String name, String message)\r\n   at EasyNetQ.Preconditions.CheckNotNull[T](T value, String name)\r\n   at EasyNetQ.MessageFactory.CreateInstance(Type messageType, Object body, MessageProperties properties)\r\n   at EasyNetQ.RabbitAdvancedBus.<>c__DisplayClass17_0.<Consume>b__0(Byte[] body, MessageProperties properties, MessageReceivedInfo messageReceivedInfo)\r\n   at EasyNetQ.Consumer.HandlerRunner.InvokeUserMessageHandler(ConsumerExecutionContext context)<---\r\n",
   "Message":"{\"Milk\":\"semi-skimmed\"}",
   "DateTime":"2018-06-01T11:01:11.645241Z",
   "BasicProperties":{
      "ContentType":null,
      "ContentEncoding":null,
      "Headers":{

      },
      "DeliveryMode":0,
      "Priority":0,
      "CorrelationId":"fe1561c1-4c7c-4489-857e-b664f27a5e5f",
      "ReplyTo":null,
      "Expiration":null,
      "MessageId":null,
      "Timestamp":0,
      "Type":"Milkshop.Common.MilkOrderRequest:Milkshop.Common",
      "UserId":null,
      "AppId":null,
      "ClusterId":null,
      "ContentTypePresent":false,
      "ContentEncodingPresent":false,
      "HeadersPresent":true,
      "DeliveryModePresent":false,
      "PriorityPresent":false,
      "CorrelationIdPresent":true,
      "ReplyToPresent":false,
      "ExpirationPresent":false,
      "MessageIdPresent":false,
      "TimestampPresent":false,
      "TypePresent":true,
      "UserIdPresent":false,
      "AppIdPresent":false,
      "ClusterIdPresent":false
   }
}

我在 .Net Core 应用程序上使用 EasynetQ 3.0.0 版

【问题讨论】:

    标签: c# .net-core rabbitmq easynetq


    【解决方案1】:

    发现错误。我的 API 项目和控制台应用程序使用不同版本的 EasynetQ nuget 包。一个是 2.33,另一个是 3.0.0。

    【讨论】:

    • 如果你需要它们是不同的版本怎么办?
    【解决方案2】:

    我不知道你是否仍然面临这个问题,我发现自己为此苦苦挣扎了至少 3 天,这似乎是 Netcore2 的 DefaultMessageSerializationStrategy 的问题。我能够使用我在互联网上找到的这个自定义类来修复:

    • JsonSerializer(实现:ISerializer
    • TypeNameSerializer(实现:ITypeNameSerializer

    最后,您可以创建自己的 DefaultMessageSerializationStrategy 实例并使用 DI:

    r.Register<IMessageSerializationStrategy>(new DefaultMessageSerializationStrategy(new TypeNameSerializer(), new MyJsonSerializer(new TypeNameSerializer()), new DefaultCorrelationIdGenerationStrategy()));
    

    不是最好的解决方案,但成功了 :D PD:我没有指向上述实现的链接,但您肯定会在互联网上通过几次搜索找到它们。

    【讨论】:

      【解决方案3】:

      我有同样的问题,但在我的情况下,我试图在 RabbitMQ 管理控制台上发布一条消息并在我的应用程序上使用。它不起作用。

      尝试使用相同的 EasyNetQ 版本做另一个应用程序(我做了另一种方法来模拟同一应用程序上的发布),并改用 Publish 方法。

      【讨论】:

        【解决方案4】:

        在我的情况下,问题与使用旧版本 ENQ 的发布者服务有关,而后者又使用 LegacyTypeNameSerializer。在使用较新版本 ENQ 的消费服务端,我所要做的就是在创建总线时添加以下内容:

        serviceRegister.EnableLegacyTypeNaming();
        

        这是一种扩展方法,应该包含在较新版本的 ENQ 中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-19
          • 1970-01-01
          • 1970-01-01
          • 2018-01-12
          • 2019-02-07
          • 2016-06-17
          • 2015-07-18
          • 2014-07-26
          相关资源
          最近更新 更多