我正在寻找一种方法将事件从我们的新NServiceBus 6端点环境发布到较旧的v4端点环境。为了使事情更有趣,v6使用JSON,而v4使用XML。从v6 JSON发布NServiceBus事件到v4 XML环境
- 我是否需要在传入的v4端点上简单添加mutator?
- 如何将JSON消息转换为XML消息?在上面提到的mutator中?
- 我是否需要在传出的事件消息中添加任何特定的v4消息标题?
我正在使用MSMQ作为基础传输层。
我正在寻找一种方法将事件从我们的新NServiceBus 6端点环境发布到较旧的v4端点环境。为了使事情更有趣,v6使用JSON,而v4使用XML。从v6 JSON发布NServiceBus事件到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));
}
}
编写定制逻辑如果它们朝向V4端点为对象到消息类型转发到XmlSerializer的串行装饰器。
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等上this github repo找到以下
endpointConfiguration.UseSerializer<CustomJsonSerializer>();
工作示例。该示例使用命令,但该方法也适用于PubSub。唯一需要注意的是特定的消息类型将始终使用一种格式。所以无法在Xml中发布相同的事件,并且无法在Json中发布其他发布。
尝试过,测试它,它的作用就像一个魅力。 –
v4已经支持多个序列化器https://docs.particular.net/nservicebus/serialization/?version=core_4为什么不将v4端点切换到Json呢?或者您是否仍有发送Xml到该端点的发件人?如果是的话,是什么促使你在v6中切换到Json? –
我们对v6和JSON的切换由我们整个系统的重新设计和替换部件(每次1个)驱动。选择JSON是因为这是我们在我们的REST端点,Java端点通信中使用的... –
我会尽量在短时间内提出一些建议。同时您是否尝试过使用http://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm? –