2

Codec是在 Spring Integration 4.2 中引入的。

但是,文档中的描述并没有真正描述编解码器与 a 的不同之处,MessageConverter或者在哪些场景中使用哪个抽象?

基本上我想知道的是:

  • Codec当抽象看起来与 a 的作用相似时,为什么要引入抽象MessageConverter
  • 为什么要使用 a Codecover aMessageConverter反之亦然?
  • 您什么时候会选择使用其中一种?

这个问题在Spring Cloud Stream的上下文中突出显示,其中配置了默认的Kryo 编解码器,但最近已经解决MessageConverter

4

1 回答 1

3

这是一个灰色地带。

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

  1. 将消息的某些外部表示转换为 spring-messaging Message<?>- 例如到/来自 mqtt 消息。
  2. 在消息通道上实现数据类型。

另一方面,编解码器仅在将消息有效负载放在网络上时(MessageBus在 XD 或BinderSpring Cloud Stream 中)处理它们。Kryo 是 Java 序列化的替代方案。

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

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

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

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

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

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

假设源发出一些由处理器接收的 POJO,而处理器内部通常会发出一个Map对象,但接收器想要接收 JSON,那么MessageConverter由于outputType声明,a 会为您执行此操作。

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

于 2016-03-16T13:27:36.413 回答