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。
我正在尝试根据流程中存在的 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。