1

我对 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 的回复通道属性来配置出站通道。我想遵循相同的模式,但创建一个新的出站渠道。我的问题是我不确定哪种类型的频道最适合返回流。端点将直接向浏览器返回一个包含图像的流(浏览器将通过 HTML img 标签发出请求)。因此,我需要我的 exampleMethod 来返回一个流 (ByteArrayOutputStream),并且我需要能够根据返回的图像类型来动态设置标题。

4

1 回答 1

0

如果您说您想通过 http 入站适配器接收请求并以某种方式打开一个流以将多个数据泵出,那么目前不支持。

Spring Integration 主要是一个消息传递框架,而不是流框架。

您提到的流式适配器用于简单的单向集成。

所有网关都是严格的请求/响应。有某些适配器(例如 tcp),您可以在其中执行这种流式传输(使用协作入站/出站适配器),但目前在 http 空间中没有任何东西(尽管我们目前正在研究一些可以启用的技术将来会这样)。

编辑:回应下面的第一条评论

该问题/答案不是流式传输输出,而是byte[]ResponseEntity. 如果这是您想要做的,只需返回带有byte[]有效负载(和适当的内容类型标头)的消息。

如果您真的希望您的服务获得对响应输出流的引用,那么您不能使用标准 http 网关来做到这一点。但是,您可以使用一个简单的 servlet/controller 并注入一个<gateway/>向 SI 发送请求;网关的接口可能是

public interface MyInterface {

    String foo(@Payload String request, @Header("stream") OutputStream stream);
}

与. service-activator_expression="@fooService.bar(payload, headers['stream'])"

于 2013-06-17T21:27:00.640 回答