EasynetQ bus.Subscribe 未发射 - 投掷 "messageType must not be null"
EasynetQ bus.Subscribe not firing - throwing "messageType must not be null"
我可以通过以下代码成功发布消息:
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 must not be null
完整消息如下:
{
"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
发现错误。我的 API 项目和控制台应用程序使用不同版本的 EasynetQ nuget 包。一个是 2.33,一个是 3.0.0。
我不知道你是否仍然面临这个问题,我发现自己为此苦苦挣扎了至少 3 天,这似乎是 DefaultMessageSerializationStrategy 的问题,对于 Netcore2 .我能够使用在互联网上找到的这个自定义 类 进行修复:
- JsonSerializer(实现:ISerializer)
- TypeNameSerializer(实现:ITypeNameSerializer)
最后,您可以创建自己的 DefaultMessageSerializationStrategy 实例并使用 DI:
r.Register<IMessageSerializationStrategy>(new DefaultMessageSerializationStrategy(new TypeNameSerializer(), new MyJsonSerializer(new TypeNameSerializer()), new DefaultCorrelationIdGenerationStrategy()));
不是最好的解决方案,但可以解决问题:D
PD:我没有指向上述实现的链接,但您肯定会通过互联网搜索找到它们。
我有同样的问题,但在我的例子中,我试图在 RabbitMQ 管理控制台上发布一条消息并在我的应用程序上使用。没用。
尝试用相同的 EasyNetQ 版本做另一个应用程序(我用另一种方法模拟在同一个应用程序上发布)并改用 Publish 方法。
在我的例子中,问题与使用旧版本 ENQ 的发布者服务有关,而后者又使用 LegacyTypeNameSerializer。在使用较新版本 ENQ 的消费服务端,我所要做的就是在创建总线时添加以下内容:
serviceRegister.EnableLegacyTypeNaming();
这是一个扩展方法,应该包含在较新版本的 ENQ 中。
我可以通过以下代码成功发布消息:
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 must not be null
完整消息如下:
{
"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
发现错误。我的 API 项目和控制台应用程序使用不同版本的 EasynetQ nuget 包。一个是 2.33,一个是 3.0.0。
我不知道你是否仍然面临这个问题,我发现自己为此苦苦挣扎了至少 3 天,这似乎是 DefaultMessageSerializationStrategy 的问题,对于 Netcore2 .我能够使用在互联网上找到的这个自定义 类 进行修复:
- JsonSerializer(实现:ISerializer)
- TypeNameSerializer(实现:ITypeNameSerializer)
最后,您可以创建自己的 DefaultMessageSerializationStrategy 实例并使用 DI:
r.Register<IMessageSerializationStrategy>(new DefaultMessageSerializationStrategy(new TypeNameSerializer(), new MyJsonSerializer(new TypeNameSerializer()), new DefaultCorrelationIdGenerationStrategy()));
不是最好的解决方案,但可以解决问题:D PD:我没有指向上述实现的链接,但您肯定会通过互联网搜索找到它们。
我有同样的问题,但在我的例子中,我试图在 RabbitMQ 管理控制台上发布一条消息并在我的应用程序上使用。没用。
尝试用相同的 EasyNetQ 版本做另一个应用程序(我用另一种方法模拟在同一个应用程序上发布)并改用 Publish 方法。
在我的例子中,问题与使用旧版本 ENQ 的发布者服务有关,而后者又使用 LegacyTypeNameSerializer。在使用较新版本 ENQ 的消费服务端,我所要做的就是在创建总线时添加以下内容:
serviceRegister.EnableLegacyTypeNaming();
这是一个扩展方法,应该包含在较新版本的 ENQ 中。