我让生产者(第三方)在ActiveMQ上发布消息,这些消息基本上是序列化的POCO对象。目前,我使用https://www.nuget.org/packages/Apache.NMS.ActiveMQ/提供的基础架构,并使用简单的管道来支持强类型消息,例如
public async void OnMessage(IMessage message)
{
var msgBody = ((ITextMessage)message).Text;
var deserialized = JsonConvert.DeserializeObject<T>(msgBody);
await Handler.Handle(deserialized);
message.Acknowledge();
}
生产者和消费者不与合约共享二进制文件,类型T是我自己的模型类,模仿了生产者使用的POCO。它非常简单,但适用于基本方案。
我尝试切换到MassTransit,但无论我使用的使用者配置如何,似乎都无法处理此类消息的反序列化。它因异常而失败
Error converting value "ID:{cluster_name}-0f5e525f2f14ad485-38017-1539583126655-8:18:1:1:2" to type 'System.Nullable`1[System.Guid]'. Path ''.
{cluster-name}是ActiveMQ群集的名称。
我在http://masstransit-project.com/MassTransit/advanced/interoperability.html上读到,MassTransit要求消息包含一组元数据属性。我尝试使用的消息没有这样的属性,因为它们来自第三方,不知道我正在尝试使用MassTransit。
问题:是否可以通过MassTransit处理此类消息?我不能强迫发布者调整消息架构。
答案 0 :(得分:0)
最好的解决方案是使用ActiveMQ客户端使用来自第三方的消息,将它们转换为将在MassTransit支持的环境中处理的消息,然后重新发布这些转换后的消息。这将是您的网关,一个轻量级的无状态服务。然后,所有其他消息使用者都可以使用MassTransit。