当前位置: 首页 > 知识库问答 >
问题:

Spring集成文件支持中的条件文件移动

百里嘉泽
2023-03-14

我正在实现如下所示的一个Spring集成工作流程。

IntegrationFlows.from("inputFileProcessorChannel")
                           .split(fileSplitterSpec, spec -> {})
                           .transform(lineItemTransformer)
                           .handle(httpRequestExecutingMessageHandler)
                           .transform(reportDataAggregator)
                           .aggregate(aggregatorSpec -> aggregatorSpec.requiresReply(false))
                           .channel("reportGeneratorChannel")
                           .get();

现在,完成上述流程后,我需要将输入文件移动到一个归档目录。决定目标目录的决定基于消息标头processingfailed,此标头添加到流程中的.transform(reportDataAggregator)步骤中。为了移动这些文件,我创建了另一个流,如下代码所示

 IntegrationFlows.from(MessageChannels.direct("inputFileProcessorChannel"))
                           .routeToRecipients(routerSpec -> {
                               routerSpec.recipient("processedFileMoverChannel", createMessageSelector(Boolean.FALSE))
                                         .recipient("failedFileMoverChannel", createMessageSelector(Boolean.TRUE));
                           })

                           .get();  

选择器方法

 private MessageSelector createMessageSelector(Boolean ruleBoolean) {
    return message -> ruleBoolean.equals(message.getHeaders().get("processingFailed"));
}
IntegrationFlows.from("reportGeneratorChannel")
                           .transform(executionReportTransformer)
                           .handle(reportWritingMessageHandlerSpec)
                           .get();

但是,正如该流所期望的那样,文件移动不会完成,因为所述头没有出现在流执行中。

那么,如何在报表文件创建后执行文件移动器流来实现这一目标呢?

共有1个答案

夔庆
2023-03-14

Filesplitter为我们填充每一行的标题,以生成:

@Override
protected boolean willAddHeaders(Message<?> message) {
    Object payload = message.getPayload();
    return payload instanceof File || payload instanceof String;
}

@Override
protected void addHeaders(Message<?> message, Map<String, Object> headers) {
    File file = null;
    if (message.getPayload() instanceof File) {
        file = (File) message.getPayload();
    }
    else if (message.getPayload() instanceof String) {
        file = new File((String) message.getPayload());
    }
    if (file != null) {
        if (!headers.containsKey(FileHeaders.ORIGINAL_FILE)) {
            headers.put(FileHeaders.ORIGINAL_FILE, file);
        }
        if (!headers.containsKey(FileHeaders.FILENAME)) {
            headers.put(FileHeaders.FILENAME, file.getName());
        }
    }
}

因此,即使您完成了聚合并准备将消息发送到.channel(“ReportGeneratorChannel”),您仍然可以访问这些与文件相关的头。

将此ReportGeneratorChannel作为PublissubscribeChannel并将“文件移动器流”移到那里,就可以实现这一目的。

顺便说一下:到目前为止,integrationflows.from(messageChannels.direct(“inputFileProcessorChannel”))和同一通道上的第二个流将导致循环调度。那不是酒吧分销。请参阅docs中的更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/core.html#channel

 类似资料:
  • 我已经在网络上提供了我的欢迎文件.xml但是在运行应用程序时,它显示 404 错误 这是一个Spring应用程序。 网络.xml 我正在使用eclipse luna,java 8,tomcat 8和maven框架。index.html 文件直接位于 webapp 文件夹下,web.xml 位于 webapp/WEB-INF 文件夹下。如果我使用索引.jsp而不是索引.html,它就可以工作。然后欢

  • publish/21-10/1-introduction.html" publish/21-10/2-using-a-multipart-resolver-with-commons-fileupload.html" publish/21-10/3-using-a-multipart-resolver-with-servlet-3.html" publish/21-10/4-handling-a-f

  • 我们在前面已经讲过如何处理静态文件,这小节我们详细的介绍如何在beego里面设置和使用静态文件。通过再介绍一个twitter开源的html、css框架bootstrap,无需大量的设计工作就能够让你快速地建立一个漂亮的站点。 beego静态文件实现和设置 Go的net/http包中提供了静态文件的服务,ServeFile和FileServer等函数。beego的静态文件处理就是基于这一层处理的,具

  • 我有一个spring集成文件,使用入站适配器从本地目录读取一些文件,然后将其存储在CouchDB中。我最终会想删除它。在我的属性文件中,我使用了delete.source.files=true。然而,这似乎不起作用。我在其他stackflow问题中读到,我可以使用ExpressionEvaluatingRequestHandlerAdvice。我将它与inboundchanneladapter一起

  • 音频导入格式 AAC AIFF M2A M4A MP2 MP3 视频导入格式 .264 3GP、3GPP AVC AVI F4V FLV MOV (QuickTime) MPE MPEG‑1 MPEG‑4 MPEG‑2(如果已安装解码器,例如使用 Adobe 视频套件) MTS MXF R3D TS VOB 视频导出格式 DPX MOV (QuickTime) MP4 图形文件格式 Photosh

  • 查找 Photoshop 中支持的文件格式列表。 音频导入格式 (*) 表示在 Photoshop CS6 中引入的支持格式。 AAC* AIFF* M2A* M4A* MP2* MP3* 视频导入格式 (*) 表示在 Photoshop CS6 中引入的支持格式。 .264* 3GP 3GPP* AVC* AVI(请参阅下面的注释) F4V* FLV* MOV (QuickTime) MPE*