将 NServiceBus 事件从 v6 JSON 发布到 v4 XML 环境

Publish NServiceBus event from v6 JSON to v4 XML environment

我正在寻找一种方法来将事件从我们新的 NServiceBus 6 端点环境发布到旧的 v4 端点环境。更有趣的是,v6 使用 JSON 而 v4 使用 XML.

我使用 MSMQ 作为底层传输层。

前进的最简单方法可能是编写自定义序列化程序定义。以下示例假定使用了 NServiceBus v6 中可用的默认 XmlSerializer 和 JsonSerializer。

编写自定义序列化器定义

public class CustomJsonSerializer : SerializationDefinition
{
    public override Func<IMessageMapper, IMessageSerializer> Configure(ReadOnlySettings settings)
    {
        var xmlSerializerDefinition = new XmlSerializer();
        var xmlSerializerFactory = xmlSerializerDefinition.Configure(settings);

        var jsonSerializerDefinition = new JsonSerializer();
        var jsonSerializerFactory = jsonSerializerDefinition.Configure(settings);
        return mapper => new DecoratorSerializer(xmlSerializerFactory(mapper), jsonSerializerFactory(mapper));
    }
}

编写一个具有自定义逻辑的序列化器装饰器,以将消息类型转发到 Xml序列化器(如果它们是针对 V4 端点的)。

class DecoratorSerializer : IMessageSerializer
{
    IMessageSerializer xmlSerializer;
    IMessageSerializer jsonSerializer;

    public DecoratorSerializer(IMessageSerializer xmlSerializer, IMessageSerializer jsonSerializer)
    {
        this.xmlSerializer = xmlSerializer;
        this.jsonSerializer = jsonSerializer;
    }

    public void Serialize(object message, Stream stream)
    {
        if (message.GetType() == typeof(MyMessage))
        {
            xmlSerializer.Serialize(message, stream);
        }
        else
        {
            jsonSerializer.Serialize(message, stream);
        }
    }

    public object[] Deserialize(Stream stream, IList<Type> messageTypes = null)
    {
        return jsonSerializer.Deserialize(stream, messageTypes);
    }

    public string ContentType
    {
        get { return jsonSerializer.ContentType; }
    }
}

像下面这样使用 CustomSerializer

endpointConfiguration.UseSerializer<CustomJsonSerializer>();

可以在 this github repo 上找到工作示例。该示例使用命令,但该方法也适用于 PubSub。唯一需要注意的是特定消息类型将始终使用一种格式。因此,不可能在 Xml 中发布一次相同的事件,而在 Json 中发布其他事件。