java - Spring 集成: Returning stream

标签 java spring stream spring-integration

我对 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-activatorexpression="@fooService.bar(payload, headers['stream'])" .

关于java - Spring 集成: Returning stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17096563/

相关文章:

java - XMLConstants.FEATURE_SECURE_PROCESSING 无法禁用

java - 通过 Post Android 发送数据到 PHP

java - 我如何在过滤器中获取请求

java - Spring ScriptUtils : with MySql causes tests to freeze forever

java - Maven 解析的版本与传递依赖中的版本不匹配

python - 将巨大的 JSON 文件流式解析为小文件

c# - 在 C# 中复制流时,什么时候应该显式执行 Flush()?

java - Java Web 应用程序的多上下文

java - 没有类型为 'org.springframework.cloud.bootstrap.encrypt.RsaProperties' 的合格 bean

list - 从列表创建无限流