gpt4 book ai didi

java - 在最大消息长度 : 2048 with payload-deserializing-transformer 之前未找到 CRLF

转载 作者:行者123 更新时间:2023-12-02 02:37:17 27 4
gpt4 key购买 nike

我在 TCP 客户端中使用有效负载解串器转换器,如下所示。

    <context:property-placeholder />

<int:gateway id="gw"
service-interface="myGateway"
default-request-channel="objectIn"
default-reply-channel="objectOut" />

<int-ip:tcp-connection-factory id="client"
type="client"
host="${client.server.TCP.host}"
port="${client.server.TCP.port}"
single-use="true"
so-timeout="10000" />

<int:channel id="objectIn" />

<int:payload-serializing-transformer input-channel="objectIn" output-channel="bytesOut"/>

<int:channel id="bytesOut" />

<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="bytesOut"
reply-channel="bytesIn"
connection-factory="client"
request-timeout="10000"
reply-timeout="10000" />

<int:channel id="bytesIn" />

<int:payload-deserializing-transformer input-channel="bytesIn" output-channel="objectOut" />

<int:channel id="objectOut" />

对于消息长度 < 2048 的情况,上面的方法工作正常,但如果消息超过此限制,我会收到以下错误。

Caused by: java.io.IOException: CRLF not found before max message length: 2048
at org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer.fillToCrLf(ByteArrayCrLfSerializer.java:66)
at org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer.deserialize(ByteArrayCrLfSerializer.java:44)
at org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer.deserialize(ByteArrayCrLfSerializer.java:31)
at org.springframework.integration.ip.tcp.connection.TcpNetConnection.getPayload(TcpNetConnection.java:120)
at org.springframework.integration.ip.tcp.connection.TcpMessageMapper.toMessage(TcpMessageMapper.java:113)
at org.springframework.integration.ip.tcp.connection.TcpNetConnection.run(TcpNetConnection.java:165)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

在这种情况下,如何在有效负载反序列化转换器上设置 maxMessageSize 属性?

最佳答案

这与变压器无关;错误出站网关。

首先,您不应该对入站 TCP 消息使用基于文本的分隔;序列化对象包含二进制数据,并且可能在中间某处包含 CRLF (0x0d0a)。

您应该在网关中使用支持二进制的反序列化器之一。

您可以在 reference manual 中阅读有关 TCP 序列化器/反序列化器的信息。 .

您应该将出站网关配置为在 serializerdeserializer 属性中使用 ByteArrayLengthHeaderSerializer;它可以处理二进制有效负载。

远程系统还需要更改为使用长度 header 而不是使用 CRLF 来检测消息的结尾。如果远程系统也是 Spring Integration,只需更改其序列化器/反序列化器即可。

对于使用基于文本的消息传递的其他读者,可以使用默认为 2048 的 maxMessageSize 配置 ByteArrayCrlfSerializer

ByteArrayLengthHeaderSerializer 还有一个可配置的 maxMessageSize(也是 2048) - 这是为了防止收到错误消息时出现 OOM 情况。

关于java - 在最大消息长度 : 2048 with payload-deserializing-transformer 之前未找到 CRLF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46109486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com