Spring Boot 集成 - 在 MessageHandler 中访问 headers

Springboot Integration - Accessing headers within a MessageHandler

我正在尝试根据流程中存在的 header 将文件移动到特定位置

@Bean
public IntegrationFlow configureFileFlow(
        @Value("${fileSource}") String sourcePath,
        @Value("${fileTarget}") String targetPath
) {
    return IntegrationFlows.from(
            getDataSource(sourcePath),
            conf -> conf.poller(Pollers.fixedDelay(pollerDelay))
    )
            .enrichHeaders(eh -> eh.header("targetPath", targetPath)) //<-- this is the target
            .enrichHeaders(eh -> eh.headerExpression("originalFileName", "payload.getName"))
            .channel("processFile.input")
            .get();
}

在处理文件时,所有必要的程序都完成后,我按以下方式调用一个bean

.handle(backupFile())

调用

@Bean
public MessageHandler backupFile() {
    FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(targetPath));
    handler.setAutoCreateDirectory(true);
    handler.setFileExistsMode(FileExistsMode.REPLACE_IF_MODIFIED);
    handler.setExpectReply(false);
    handler.setDeleteSourceFiles(true);
    return handler;
}

请问如何根据 header 中的设置动态设置 targetPath?我不能简单地将它作为参数传递,因为它是一个 bean,我想避免仅仅为了检索 String 而创建更多 bean。在流程的第二部分再次使用 @Value 感觉是多余的,因为它已经是消息本身的一部分,在 headers.

正在处理多种类型的文件,每种文件都有自己的 IntegrationFlow 来源,但是“备份”的这一部分应该在所有文件中共享。 backupFile bean 基本上需要有两个信息 - 作为负载的文件本身和来自 headers 的关于存储位置的信息。

谢谢!

查看不同的构造函数:

/**
 * Constructor which sets the {@link #destinationDirectoryExpression}.
 * @param destinationDirectoryExpression Must not be null
 * @see #FileWritingMessageHandler(File)
 */
public FileWritingMessageHandler(Expression destinationDirectoryExpression) {

因此,使用上面的类似 SpEL 表达式,您可以执行以下操作:

new FileWritingMessageHandler(new SpelExpressionParser().parseExpression("headers.targetPath"));

另请参阅 org.springframework.integration.file.dsl.Files.outboundAdapter() 以获得比 FileWritingMessageHandler 更高级的 Java DSL API。