我们从 Apache Camel 3.16.0 升级到 4.7.0(包括将 Java 11 升级到 21)。我们必须在没有缓存的情况下流式传输大型 HTTP 响应,但这在新版本中不再按预期工作。我们有这条路线:
from(DIRECT_GETITEM)
.process(collectionCheckingPdp)
.setHeader(Exchange.HTTP_METHOD, constant(HTTP_GET))
.removeHeader(Exchange.HTTP_URI)
.process(new StorageManagerPathProcessor())
.to("http://localhost:9099?disableStreamCache=true&headerFilterStrategy=#oldaHttpFilter");
在 Camel 版本 3.16.0 中,生成的交换消息的正文是
org.apache.http.conn.EofSensorInputStream
类型。
但在 Camel 4.7.0 中,交换消息体是一个 byte[] 数组,而我们仍然期望一个流。
我们可以做些什么来避免读取内存中的响应并获得与旧版本中相同的行为?
由于我们使用的是Spring Boot,所以我也在application.properties中尝试了这个设置,但没有任何效果:
camel.component.http.response-payload-streaming-threshold=-1
Camel HTTP 生产者应在 disableStreamCache=true 时将消息正文设置为响应输入流,但一个错误导致它将响应正文读入内存。 该 bug 已在 Apache Camel 4.8.0 中修复。
但这还不是故事的全部。 流缓存默认启用。 如果消息体是输入流,Camel 会将其转换为流缓存。 要禁用整个 Camel 上下文的流缓存,请设置应用程序属性:
camel.main.stream-caching-enabled=false