Spring 集成 + 文件读取消息源 _ 入站通道适配器 + 出站网关



用于文件读取消息源入站适配器和转换器 带注释配置如下

@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
public MessageSource<File> fileReadingMessageSource() {
}
@Transformer(inputChannel = "incomingchannel", outputChannel = "jobLaunchChannel")
public JobLaunchRequest toRequest(Message<File> message) throws Exception {
}

现在我想更改转换器以引用出站网关的回复通道,即将文件从一个目录移动到另一个目录,即将文件从传入通道目录移动到另一个目录,并处理或转换文件或执行一些验证

<file:outbound-gateway id="mover" request-channel="incomingchannel" reply-channel="newdirectory" directory="<<path to new directory file to be moved" delete-source-files="true"/>

有人将上述XML配置转换为注释配置或任何想法吗?

注释配置后,我将不得不更改转换器输入通道以引用 newdirectory 通道,即这是消息传递网关的回复通道......

提前感谢您对此的任何帮助或建议

--- 在尝试Artem链接中提供的片段后更新1

@Bean
@ServiceActivator(inputChannel = "incomingchannel")
public MessageHandler fileWritingMessageHandler() {
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(newdirectorypath));
handler.setFileExistsMode(FileExistsMode.APPEND);
handler.setDeleteSourceFiles(true);
return handler;
}
@MessagingGateway(defaultRequestChannel = "incomingchannel", defaultReplyChannel = "newdirectorychannel")
public interface MyGateway {
void writeToFile(@Header(FileHeaders.FILENAME) String fileName, @Header(FileHeaders.FILENAME) File directory,
String data);
}

但是遇到了两个问题

  1. 入站适配器正在尝试将目录也作为文件轮询(使用递归目录扫描程序)- 如何确保目录不作为文件轮询

  2. 嵌套异常org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available, failedMessage=GenericMessage [payload=C

好的。由于看起来您想将FileWritingMessageHandler放在@InboundChannelAdapter之后和@Transformer之前,所以这应该是这样的:

@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
public MessageSource<File> fileReadingMessageSource() {
}
@Bean
@ServiceActivator(inputChannel = "incomingchannel")
public MessageHandler fileWritingMessageHandler() {
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(newdirectorypath));
handler.setFileExistsMode(FileExistsMode.APPEND);
handler.setDeleteSourceFiles(true);
handler.setOutputChannelName("jobLaunchTransfromerCannel");
return handler;
}
@Transformer(inputChannel = "jobLaunchTransfromerCannel", outputChannel = "jobLaunchChannel")
public JobLaunchRequest toRequest(Message<File> message) throws Exception {
}

这样,@InboundChannelAdapter将文件发送到其逻辑的FileWritingMessageHandler中,该逻辑为下一个流@Transformer生成结果文件,以将结果文件转换为JobLaunchRequest。只有在此之后,才会向jobLaunchChannel发送一条消息以提交 春季批处理Job.

最新更新