IP 端点的一个目标是提供与 Spring Integration 应用程序以外的系统的通信。 因此,默认情况下仅发送和接收消息有效负载。 从 3.0 开始,您可以使用 JSON、Java 序列化或自定义序列化程序和反序列化程序来传输标头。 有关详细信息,请参阅传输标头。 框架(使用网关时除外)或服务器端的协作通道适配器不提供任何消息关联。在本文档的后面部分,我们将讨论应用程序可用的各种关联技术。 在大多数情况下,这需要特定的应用程序级消息关联,即使消息负载包含一些自然关联数据(如订单号)。Spring中文文档

网关

网关会自动关联消息。 但是,对于容量相对较低的应用程序,应使用出站网关。 将连接工厂配置为对所有消息对使用单个共享连接 ('single-use=“false”') 时,一次只能处理一条消息。 新消息必须等到收到对上一条消息的回复。 当为每条新消息配置连接工厂以使用新连接 ('single-use=“true”') 时,此限制不适用。 虽然此设置可以提供比共享连接环境更高的吞吐量,但它会带来为每个消息对打开和关闭新连接的开销。Spring中文文档

因此,对于大容量消息,请考虑使用一对协作的通道适配器。 但是,为此,您需要提供协作逻辑。Spring中文文档

Spring Integration 2.2 中引入的另一种解决方案是使用 ,它允许使用共享连接池。CachingClientConnectionFactorySpring中文文档

协作出站和入站通道适配器

若要实现高容量吞吐量(避免使用网关的陷阱,如前所述),可以配置一对协作的出站和入站通道适配器。 您还可以使用协作适配器(服务器端或客户端)进行完全异步通信(而不是使用请求-答复语义)。 在服务器端,消息关联由适配器自动处理,因为入站适配器添加了一个标头,该标头允许出站适配器确定在发送应答消息时要使用的连接。Spring中文文档

在服务器端,必须填充标头,因为它用于将消息与连接相关联。 源自入站适配器的邮件会自动设置标头。 如果要构造要发送的其他消息,则需要设置标题。 您可以从传入消息中获取标头值。ip_connectionId

在客户端,如果需要,应用程序必须提供自己的关联逻辑。 您可以通过多种方式做到这一点。Spring中文文档

如果消息负载具有一些自然关联数据(例如事务 ID 或订单号),并且您不需要保留原始出站消息中的任何信息(例如回复通道标头),则关联很简单,并且在任何情况下都会在应用程序级别完成。Spring中文文档

如果消息负载具有一些自然关联数据(如事务 ID 或订单号),但您需要保留原始出站消息中的某些信息(例如回复通道标头),则可以保留原始出站消息的副本(可能通过使用发布-订阅通道)并使用聚合器重新组合必要的数据。Spring中文文档

对于前两种情况中的任何一种,如果有效负载没有自然相关数据,则可以在出站通道适配器的上游提供转换器,以使用此类数据增强有效负载。 这种转换器可以将原始有效负载转换为包含原始有效负载和消息标头的某些子集的新对象。 当然,标头中的实时对象(如回复通道)不能包含在转换后的有效负载中。Spring中文文档

如果选择此类策略,则需要确保连接工厂具有适当的序列化程序-反序列化程序对来处理此类有效负载(例如,使用 Java 序列化的 和 ,或者自定义序列化程序和反序列化程序)。 TCP 连接工厂中提到的选项(包括默认的 )不支持此类有效负载,除非转换后的有效负载是 或 。DefaultSerializerDefaultDeserializerByteArray*SerializerByteArrayCrLfSerializerStringbyte[]Spring中文文档

在 2.2 版本之前,当协作通道适配器使用客户端连接工厂时,该属性默认为默认回复超时(10 秒)。 这意味着,如果入站适配器在这段时间内未收到任何数据,则套接字将关闭。so-timeoutSpring中文文档

此默认行为在真正的异步环境中不适用,因此它现在默认为无限超时。 可以通过将客户端连接工厂上的属性设置为 10000 毫秒来恢复以前的默认行为。so-timeoutSpring中文文档

从版本 5.4 开始,多个出站通道适配器和一个可以共享同一个连接工厂。 这允许应用程序同时支持请求/应答和任意服务器→客户端消息传递。 有关详细信息,请参阅 TCP 网关TcpInboundChannelAdapterSpring中文文档

在服务器端,必须填充标头,因为它用于将消息与连接相关联。 源自入站适配器的邮件会自动设置标头。 如果要构造要发送的其他消息,则需要设置标题。 您可以从传入消息中获取标头值。ip_connectionId

在 2.2 版本之前,当协作通道适配器使用客户端连接工厂时,该属性默认为默认回复超时(10 秒)。 这意味着,如果入站适配器在这段时间内未收到任何数据,则套接字将关闭。so-timeoutSpring中文文档

此默认行为在真正的异步环境中不适用,因此它现在默认为无限超时。 可以通过将客户端连接工厂上的属性设置为 10000 毫秒来恢复以前的默认行为。so-timeoutSpring中文文档

传输标头

TCP 是一种流协议。 并在流中划分消息。 在 3.0 之前,只能通过 TCP 传输消息负载 ( 或 )。 从 3.0 开始,您可以传输选定的标头以及有效负载。 但是,“活动”对象(如标头)无法序列化。SerializersDeserializersStringbyte[]replyChannelSpring中文文档

通过 TCP 发送标头信息需要一些额外的配置。Spring中文文档

第一步是提供使用该属性的 。 此映射器委托给任何实现,以将消息与某个对象之间的消息相互转换,这些对象可由配置的 和 进行序列化和反序列化。ConnectionFactoryMessageConvertingTcpMessageMappermapperMessageConverterserializerdeserializerSpring中文文档

Spring Integration 提供了一个 ,它允许指定添加到对象的标头列表以及有效负载。 生成的 Map 有两个条目:和 。 该条目本身是 a 并包含选定的标头。MapMessageConverterMappayloadheadersheadersMapSpring中文文档

第二步是提供一个串行器和解串器,它们可以在一种和某种线路格式之间进行转换。 这可以是自定义的 ,如果对等系统不是 Spring Integration 应用程序,则通常需要它。MapSerializerDeserializerSpring中文文档

Spring Integration 提供了将 JSON 与 JSON 之间的转换。 它使用 Spring Integration 。 如果需要,您可以提供自定义项。 默认情况下,序列化程序在对象之间插入换行符 () 字符。 有关更多信息,请参见 JavadocMapJsonSerializerMapJsonObjectMapperJsonObjectMapper0x0aSpring中文文档

使用类路径上的任何版本。JsonObjectMapperJackson

您还可以通过使用 和 来对 使用标准 Java 序列化 。MapDefaultSerializerDefaultDeserializerSpring中文文档

以下示例显示了使用 JSON 传输 、 和标头的连接工厂的配置:correlationIdsequenceNumbersequenceSizeSpring中文文档

<int-ip:tcp-connection-factory id="client"
    type="client"
    host="localhost"
    port="12345"
    mapper="mapper"
    serializer="jsonSerializer"
    deserializer="jsonSerializer"/>

<bean id="mapper"
      class="o.sf.integration.ip.tcp.connection.MessageConvertingTcpMessageMapper">
    <constructor-arg name="messageConverter">
        <bean class="o.sf.integration.support.converter.MapMessageConverter">
            <property name="headerNames">
                <list>
                    <value>correlationId</value>
                    <value>sequenceNumber</value>
                    <value>sequenceSize</value>
                </list>
            </property>
        </bean>
    </constructor-arg>
</bean>

<bean id="jsonSerializer" class="o.sf.integration.ip.tcp.serializer.MapJsonSerializer" />

使用上述配置发送的消息,有效负载为“something”,将显示在网络上,如下所示:Spring中文文档

{"headers":{"correlationId":"things","sequenceSize":5,"sequenceNumber":1},"payload":"something"}
使用类路径上的任何版本。JsonObjectMapperJackson