Spring Integration中Codec和MessageConverter的区别

时间:2016-03-16 10:44:56

标签: spring-integration spring-cloud-stream

在Spring Integration 4.2中引入了

Codec

然而,docs中的描述并没有真正描述编解码器与MessageConverter的不同之处,或者在哪些场景中使用哪种抽象?

基本上我想知道的是:

  • 为什么Codec抽象在看似与MessageConverter相似时引入?
  • 为什么要使用Codec而不是MessageConverter,反之亦然?
  • 你什么时候选择使用其中一个?

此问题在Spring Cloud Stream的上下文中突出显示,其中配置了默认Kryo Codec,但最近已有工作around MessageConverter's

1 个答案:

答案 0 :(得分:2)

这有点灰色。

MessageConverters在Spring Integration中用于两个方面:

  1. 将邮件的某些外部表示转换为春季邮件Message<?> - 例如来自/来自mqtt消息。
  2. 实施datatype on message channels
  3. 另一方面,编解码器只在将它们放在线路上时处理消息有效负载(在XD中为MessageBus或在Spring Cloud Stream中为Binder)。 Kryo是Java序列化的替代品。

    应用程序通常不直接处理编解码器,但Spring Integration提供CodecMessageConverter,它在转换时采用编解码器对有效负载进行编码/解码。

    它还提供了一个基于编解码器的转换器,因此应用程序可以在流程中的其他位置进行编码/解码(如果愿意)。

    因此,在Spring Cloud Stream的上下文中,Kryo Codec用于对Binder中的有效负载进行编码/解码。

    消息转换器用于使用频道dataType功能在Binder绑定到传输的应用程序内实现转换。

    让我们看一下使用Spring Cloud DataFlow的示例:

    stream create foo --definition "source | processor --outputType=application/json | sink"
    

    让我们说源会发出处理器收到的一些POJO,处理器内部通常会发出Map个对象,但是接收器想要接收JSON,然后是MessageConverter因为outputType声明而为你做这件事。

    源和处理器以及处理器和接收器之间的数据以kryo​​的形式传输。