Java 春季整合:回归潮流

Java 春季整合:回归潮流,java,spring,stream,spring-integration,Java,Spring,Stream,Spring Integration,我对Spring集成非常陌生,并试图找出如何返回数据流,但找不到任何示例。我找到了ByTestStreamWritingMessageHandler,但它对我来说似乎有点模糊,并且没有提供用法示例(除了bean定义)。我假设我需要定义一个使用ByTestStreamWritingMessageHandler的通道,并在入站网关中引用它(通过回复通道),但我有一些问题: 首先,我说得对吗? 我可以使用默认频道类型吗? 我需要通道适配器吗? 我可以从我的服务方法返回ByteArrayOutputSt

我对Spring集成非常陌生,并试图找出如何返回数据流,但找不到任何示例。我找到了ByTestStreamWritingMessageHandler,但它对我来说似乎有点模糊,并且没有提供用法示例(除了bean定义)。我假设我需要定义一个使用ByTestStreamWritingMessageHandler的通道,并在入站网关中引用它(通过回复通道),但我有一些问题:

首先,我说得对吗? 我可以使用默认频道类型吗? 我需要通道适配器吗? 我可以从我的服务方法返回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网关的reply channel属性来配置出站通道。我希望遵循相同的模式,但创建一个新的出站通道。我的问题是,我不确定哪种类型的通道最适合返回流。端点将直接向浏览器返回包含图像的a流(浏览器将通过HTML img标记发出请求)。因此,我需要我的exampleMethod返回一个流(ByteArrayOutputStream),并且我需要根据返回的图像类型访问动态设置的头。

如果您说希望通过http入站适配器接收请求并以某种方式打开一个流以输出多个数据,不,这是当前不支持的

Spring集成主要是一个消息传递框架,而不是流式框架

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

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

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

该问题/答案不是流式输出,而是在
响应属性中返回
字节[]
。如果您想这样做,只需返回一条带有
字节[]
有效负载(以及相应的内容类型标题)的消息

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

public interface MyInterface {

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

使用
service activator
具有
expression=“@fooService.bar(有效负载,标题['stream'])”

我需要更详细地了解您的用例<代码>消息处理程序
s,例如,一个是“单向”内点(出站)。你不能只是把一个连接到一个入站网关。为了进一步回答你的问题,我需要知道你在谈论什么样的网关,以及你想做什么的更多细节。有很多可能性,但我不想浪费我(或你)的时间在猜测上。谢谢Gary,我会用更多的细节更新原始帖子。基本上我想做的是参考。但是,我不能将HttpServletResponse作为参数传递给服务,因为它可能并不总是通过Http调用。没有办法访问传出的字节流吗?谢谢Gary,字节数组是我正在做的正确方法。最后一个问题是如何动态设置内容类型标题?图像将具有不同的类型,我需要检查数据库中的一个字段以了解mime-type。只需将其添加到SI消息的
内容类型
标头,它将映射到Http
内容类型
标头。如果您的服务返回
消息
,只需使用
返回MessageBuilder.withPayload(myBytes).setHeader(MessageHeaders.CONTENT_TYPE,“foo/bar”).build()
如果您不想将SI基础结构公开给您的代码,请返回
映射
,并使用
进行必要的转换。谢谢您…我缺少的是消息的返回类型,而不是字节[]。