我对Spring Integration非常陌生,并试图找出如何返回数据流,但找不到任何示例。我找到了关于ByteStreamWritingMessageHandler的文档,但它对我来说似乎有点模糊,并且没有提供使用示例(除了bean定义)。我假设我需要做的是定义一个使用ByteStreamWritingMessageHandler的通道,并在我的入站网关(通过应答通道)中引用它,但我有一些问题:
首先,我说的对吗?我可以使用默认的通道类型吗?我需要一个通道适配器吗?我可以从我的服务方法返回一个ByteArrayOutputStream吗?通道定义是什么样的呢?
任何帮助都将是非常感激的。
--------------- 更新 -----------
当前端点的结构如下:
<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"/>
因此,我们使用两个通道,一个用于入站,一个用于出站,并使用http:inbound-gateway的reply-channel属性来配置出站通道。我想遵循相同的模式,但创建一个新的出站通道。我的问题是,我不确定哪种类型的通道最适合返回流。端点将直接向浏览器返回一个包含图像的流(浏览器将通过HTML img标记发出请求)。所以,我需要我的exampleMethod来返回一个流(ByteArrayOutputStream),我需要根据返回的图像类型动态设置标题。
如果你说你想通过http入站适配器接收请求,然后以某种方式打开一个流来泵出多个数据,那么目前不支持。
Spring Integration主要是一个消息传递框架,而不是流框架。
您所引用的流式适配器是用于简单的单向集成的。
所有网关都是严格的请求/响应。有特定的适配器(如tcp),您可以在其中执行这种流(使用协作的入站/出站适配器),但目前在http空间中没有任何东西(尽管我们目前正在研究一些技术,这些技术将在未来启用)。
EDIT:对下面第一条评论的回应
这个问题/答案不是流输出,它在ResponseEntity
中返回byte[]
。如果这就是您想要做的,只需返回带有byte[]
有效负载(和适当的内容类型标头)的消息。
如果你真的想让你的服务获得对响应输出流的引用,不,你不能用标准的http网关做到这一点。但是,您可以使用一个简单的servlet/控制器并注入<gateway/>
来向SI发送请求;网关的接口可能是
public interface MyInterface {
String foo(@Payload String request, @Header("stream") OutputStream stream);
}
service-activator
有expression="@fooService.bar(payload, headers['stream'])"