Spring integration Spring集成中Codec和MessageConverter的区别

Spring integration Spring集成中Codec和MessageConverter的区别,spring-integration,spring-cloud-stream,Spring Integration,Spring Cloud Stream,在SpringIntegration4.2中引入了 但是,中的描述并没有真正描述编解码器如何不同于或在哪些场景中使用哪种抽象 基本上我想知道的是: 当MessageConverter的功能类似时,为什么要引入Codec抽象 为什么要在消息转换器上使用编解码器,反之亦然 什么时候你会选择使用其中一个而不是另一个 这个问题是在有默认配置但最近有工作的情况下强调的。这是一个灰色区域 messageconverter在Spring集成中用于两个领域: 将消息的某些外部表示转换为spring消息消息—

在SpringIntegration4.2中引入了

但是,中的描述并没有真正描述编解码器如何不同于或在哪些场景中使用哪种抽象

基本上我想知道的是:

  • MessageConverter
    的功能类似时,为什么要引入
    Codec
    抽象
  • 为什么要在
    消息转换器上使用
    编解码器
    ,反之亦然
  • 什么时候你会选择使用其中一个而不是另一个

这个问题是在有默认配置但最近有工作的情况下强调的。

这是一个灰色区域

messageconverter
在Spring集成中用于两个领域:

  • 将消息的某些外部表示转换为spring消息
    消息
    ——例如,与mqtt消息之间的转换
  • 实施
  • 另一方面,编解码器仅在将消息有效负载放到线上时处理它们(XD中的
    MessageBus
    或Spring Cloud Stream中的
    Binder
    )。Kryo是Java序列化的替代品

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

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

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

    消息转换器用于使用通道
    数据类型
    功能在绑定到绑定器传输的应用程序内实现转换

    让我们看一个使用Spring云数据流的示例:

    stream create foo --definition "source | processor --outputType=application/json | sink"
    
    假设源代码发出一些处理器接收的POJO,处理器内部通常发出一个
    Map
    对象,但是接收器想要接收JSON,然后
    MessageConverter
    会因为
    outputType
    声明为您这样做


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

    根据您的示例,可以准确地说:在输出通道上给定一个简单的POJO和一个
    application/json
    的内容类型,POJO将转换为json表示形式,即
    java.lang.String
    (例如使用
    PojoToJsonMessageConverter
    )和“在线”负载将是
    byte[]
    ,使用编解码器进行编码(在本例中为Kryo,但可以是Java序列化).e.
    MessageConverter
    s转换为/从应用程序/域对象,而编解码器在较低级别上序列化,即通过实际绑定发送的内容。好的,谢谢!您的流定义使用
    --outputType=application/json
    ,但是此提交()提到
    spring.cloud.stream.bindings..contentType
    。假设它们(
    outputType
    vs.
    contentType
    )意思相同,为什么命名不同?因为处理器既有输入通道又有输出通道…
    。|处理器--inputType=foo outputType=bar |…
    。记住,这个例子是在spring cloud数据流的上下文中,而不是底层spring cloud流中。@GaryRussell,我需要添加一个新的kryo序列化程序(我知道如何创建一个),标准的kryo没有正确地序列化一个集合,我一直在查看代码,上面都是你的名字:-)干得好,谢谢!我希望你能解释一下如何告诉spring integration我的新序列化程序?我需要创建一个新的“注册器”吗要处理新的序列化程序?只需扩展“Codec”并将其作为bean提供即可?我今天已经完成了。一般来说,问一个新问题比评论一个旧问题更好。答案可能取决于您使用编解码器的上下文。因此,为新问题提供更多上下文。