Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring集成中从方法返回值而不中断原始消息流?_Java_Spring_Spring Integration - Fatal编程技术网

Java 如何在Spring集成中从方法返回值而不中断原始消息流?

Java 如何在Spring集成中从方法返回值而不中断原始消息流?,java,spring,spring-integration,Java,Spring,Spring Integration,fileProcessorbean的encode方法负责编码视频文件。如果遇到问题,则不应删除该文件,否则如果一切正常,则可以删除。现在,保持消息流而不更改有效负载的唯一方法是使encode方法返回void。我需要返回一些“头”信息,以便SI以后可以删除该文件。我尝试使用MessageBuilder创建一条消息并返回它,但当它到达下一个频道时,它已被包装,并且消息中有一条消息,因此我的表达式无法触发删除 我想我可以使用包装的消息在对象图中挖掘一个层次,但这看起来很笨拙 在不破坏原始消息有效负载和

fileProcessor
bean的
encode
方法负责编码视频文件。如果遇到问题,则不应删除该文件,否则如果一切正常,则可以删除。现在,保持
消息流而不更改有效负载的唯一方法是使
encode
方法返回
void
。我需要返回一些“头”信息,以便
SI
以后可以删除该文件。我尝试使用
MessageBuilder
创建一条
消息
并返回它,但当它到达下一个频道时,它已被包装,并且
消息
中有一条
消息
,因此我的表达式无法触发删除

我想我可以使用包装的
消息
在对象图中挖掘一个层次,但这看起来很笨拙

在不破坏原始消息有效负载和不污染我的带有SI通道和发送的POJO编码方法的情况下,附加一些返回值的最佳方法是什么

以下是我的配置:

<!-- ########################## -->
<!-- ###      Encoding      ### -->
<!-- ########################## -->

<file:inbound-channel-adapter 
    directory="${paths.encode}"
    channel="encodeChannel"
    filename-regex="${encode.regex}"
    prevent-duplicates="false">
    <int:poller fixed-rate="5000"/>
</file:inbound-channel-adapter>

<int:service-activator
    input-channel="encodeChannel"
    output-channel="encodeResultChannel"
    ref="fileProcessor"
    method="encode">
</int:service-activator>    

<!-- This is where I'm having trouble.  -->
<!-- I don't expect this router to work. -->
<int:router
    input-channel="encodeResultChannel"
    expression="payload">       
    <int:mapping value="true" channel="encodeDeleteChannel"/>
    <int:mapping value="false" channel="stdout"/>
</int:router>

<int:service-activator
    input-channel="encodeDeleteChannel"
    expression="payload.delete()"
    output-channel="stdout">
</int:service-activator>

<stream:stdout-channel-adapter 
    id="stdout" 
    append-newline="true" />

编辑:

我正在使用:

<properties>
    <spring-framework.version>3.2.3.RELEASE</spring-framework.version>
</properties>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring-framework.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-integration</artifactId>
    <version>1.1.0.BUILD-SNAPSHOT</version>
</dependency>

3.2.3.1发布
org.springframework
spring上下文
${spring framework.version}
org.springframework.boot
spring boot启动器集成
1.1.0.1构建快照
编辑2:

这是更新的配置

<!-- ########################## -->
<!-- ###      Encoding      ### -->
<!-- ########################## -->

<file:inbound-channel-adapter 
    directory="${paths.encode}"
    channel="filePickupChannel"
    filename-regex="${encode.regex}"
    prevent-duplicates="false">
    <int:poller fixed-rate="5000"/>
</file:inbound-channel-adapter>

<int:header-enricher
    input-channel="filePickupChannel"
    output-channel="encodeChannel">
    <int:header name="origFile" expression="payload"/>
</int:header-enricher>

<int:service-activator
    input-channel="encodeChannel"
    output-channel="encodeResultChannel"
    ref="fileProcessor"
    method="encode">
</int:service-activator>    

<int:router
    input-channel="encodeResultChannel"
    ignore-send-failures="false"
    default-output-channel="stdout"
    expression="payload">       
    <int:mapping value="true" channel="encodeDeleteChannel"/>
    <int:mapping value="false" channel="stdout"/>
</int:router>

<int:service-activator
    input-channel="encodeDeleteChannel"
    expression="headers['origFile'].delete()"
    output-channel="stdout">
</int:service-activator>

您使用的是哪个版本的Spring集成和Spring框架

fileProcessor.encode()
的签名是什么样子的

您不应该得到嵌套的
消息
AbstractReplyProducingMessageHandler
具有以下逻辑

private Message<?> createReplyMessage(Object reply, MessageHeaders requestHeaders) {
    AbstractIntegrationMessageBuilder<?> builder = null;
    if (reply instanceof Message<?>) {
        if (!this.shouldCopyRequestHeaders()) {
            return (Message<?>) reply;
        }
        builder = this.getMessageBuilderFactory().fromMessage((Message<?>) reply);
    }

...

    if (this.shouldCopyRequestHeaders()) {
        builder.copyHeadersIfAbsent(requestHeaders);
    }
    return builder.build();
}

如果您需要在编码后访问有效载荷,请考虑将其提前提升到一个页眉。

<int:header-enricher ...>
    <int:header name="origFile" expression="payload" />
</int:header-enricher>

然后在编码后使用
expression=“headers['origFile'].delete()

编辑:


或者,返回文件(使其成为新的有效负载)成功和失败时,返回
null
或抛出异常,下游流将不会执行。

遇到包装消息时,我正在返回org.springframework.messaging消息。将其更改为org.springframework.integration确实会导致您描述的所需行为。我更喜欢您的建议gh希望使用POJO,这是我最初尝试完成的。我不知道头enricher的这种用法(仍在学习中)。这现在可以正常工作,非常感谢您分享此解决方案。下面是新消息…18:51:41.373[task-scheduler-5]DEBUG o.s.i.channel.DirectChannel-在通道“encodeDeleteChannel”上显示,消息:[Payload=true][Headers={timestamp=1401144701371,id=107b6f6b-c925-deb0-a2a5-7f1dbd2357a8,origFile=C:\share\datagator\encode\test video.mpg}]
<int:header-enricher ...>
    <int:header name="origFile" expression="payload" />
</int:header-enricher>