2017-08-09 32 views
2

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

  • 我是否需要在传入的v4端点上简单添加mutator?
  • 如何将JSON消息转换为XML消息?在上面提到的mutator中?
  • 我是否需要在传出的事件消息中添加任何特定的v4消息标题?

我正在使用MSMQ作为基础传输层。

+0

v4已经支持多个序列化器https://docs.particular.net/nservicebus/serialization/?version=core_4为什么不将v4端点切换到Json呢?或者您是否仍有发送Xml到该端点的发件人?如果是的话,是什么促使你在v6中切换到Json? –

+0

我们对v6和JSON的切换由我们整个系统的重新设计和替换部件(每次1个)驱动。选择JSON是因为这是我们在我们的REST端点,Java端点通信中使用的... –

+0

我会尽量在短时间内提出一些建议。同时您是否尝试过使用http://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm? –

回答

1

向前移动最简单的方法是写一个自定义序列化器定义。以下示例假定使用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中发布其他发布。

+0

尝试过,测试它,它的作用就像一个魅力。 –