首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >EasynetQ bus.Subscribe未触发-引发"messageType不能为空“

EasynetQ bus.Subscribe未触发-引发"messageType不能为空“
EN

Stack Overflow用户
提问于 2018-06-02 02:11:35
回答 4查看 2.4K关注 0票数 2

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

代码语言:javascript
复制
        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队列就会递增。以下是监听程序的代码:

代码语言:javascript
复制
        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");
        });

我还尝试了以下几种方法,但都没有成功:

代码语言:javascript
复制
        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}.");
        });

我在谷歌上找不到关于这个例外的答案:

messageType不能为空

下面是完整的信息:

代码语言:javascript
复制
{
   "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核心应用程序上使用EasynetQ版本3.0.0

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-02 02:59:22

已找到错误。我的应用程序接口项目和控制台应用程序使用不同版本的EasynetQ nuget包。一个是2.33,另一个是3.0.0。

票数 3
EN

Stack Overflow用户

发布于 2018-09-15 00:20:45

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

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

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

代码语言:javascript
复制
r.Register<IMessageSerializationStrategy>(new DefaultMessageSerializationStrategy(new TypeNameSerializer(), new MyJsonSerializer(new TypeNameSerializer()), new DefaultCorrelationIdGenerationStrategy()));

不是最好的解决方案,但确实做到了:D PD:我没有指向上面实现的链接,但你肯定可以在互联网上搜索到它们。

票数 1
EN

Stack Overflow用户

发布于 2020-04-16 07:17:57

我也有同样的问题,但在我的例子中,我试图在RabbitMQ管理控制台上发布一条消息,并在我的应用程序上消费。它不起作用。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50648956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档