我对 Spring Integration 非常陌生,并试图弄清楚如何返回数据流,但找不到任何示例。我发现documentation围绕 ByteStreamWritingMessageHandler,但对我来说似乎有点模糊,并且没有提供使用示例(除了 bean 定义)。我假设我需要做的是定义一个使用 ByteStreamWritingMessageHandler 的 channel 并在我的入站网关中引用它(通过回复 channel ),但我有一些问题:
首先,我说得对吗? 我可以使用默认 channel 类型吗? 我需要 channel 适配器吗? 我可以从我的服务方法返回 ByteArrayOutputStream 吗? channel 定义是什么样的?
任何帮助将不胜感激。
---------------更新------------
我们当前的端点结构如下:
<int:channel id="httpReplyChannel"/>
<int:channel id="exampleService.exampleMethod"/>
<int-http:inbound-gateway path="/example"
supported-methods="POST"
request-channel="exampleService.exampleMethod"
request-payload-type="java.lang.Integer"
reply-channel="httpReplyChannel"
message-converters="jsonMessageConverter"
mapped-request-headers="*"/>
<int:service-activator input-channel="exampleService.exampleMethod"
ref="exampleService"
method="exampleMethod"/>
因此,我们使用两个 channel ,一个用于入站,一个用于出站,并使用 http:inbound-gateway 的回复 channel 属性来配置出站 channel 。我想遵循相同的模式,但创建一个新的出站 channel 。我的问题是,我不确定哪种类型的 channel 最适合返回流。端点将直接向浏览器返回包含图像的流(浏览器将通过 HTML img 标签发出请求)。因此,我需要我的 exampleMethod 返回一个流 (ByteArrayOutputStream),并且我需要能够根据返回的图像类型动态设置 header 。
最佳答案
如果您说您希望通过 http 入站适配器接收请求,并以某种方式打开一个流来抽取多个数据,那么目前不支持这种情况。
Spring Integration 主要是一个消息传递框架,而不是一个流框架。
您提到的流适配器用于简单的单向集成。
所有网关都是严格的请求/响应。有某些适配器(例如 tcp)可以执行这种流式传输(通过协作入站/出站适配器),但目前在 http 空间中还没有任何东西(尽管我们目前正在研究多种技术,这些技术将启用将来也是如此)。
编辑:回应下面的第一条评论
该问题/答案不是流式输出,而是返回 byte[]
在 ResponseEntity
。如果这就是您想要做的,只需返回一 strip 有 byte[]
的消息即可。有效负载(以及适当的内容类型 header )。
如果您确实希望您的服务获得对响应输出流的引用,那么您不能使用标准 http 网关来做到这一点。但是,您可以使用简单的 servlet/ Controller 并注入(inject) <gateway/>
向 SI 发送请求;网关的接口(interface)可能是
public interface MyInterface {
String foo(@Payload String request, @Header("stream") OutputStream stream);
}
与 service-activator
有expression="@fooService.bar(payload, headers['stream'])"
.
关于java - Spring 集成: Returning stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17096563/