我需要根据邮件内容从S3下载文件。换句话说,要下载的文件以前是未知的,我将在运行时搜索并找到它。 S3StreamingMessageSource似乎并不合适,因为:
S3StreamingMessageSource
。 gateway(IntegrationFlow)
看起来很有趣,但我需要的是gateway(Function<Message<?>, IntegrationFlow>)
不存在。另一位候选人是S3MessageHandler,但它不支持列出我找到所需文件所需的文件。
我可以直接使用AWS API实现自己的消息处理程序,只是想知道我是否遗漏了某些东西,因为这似乎不是一个不寻常的要求。毕竟,不是每个应用程序都只是坐在那里并继续轮询S3以获取新文件。
答案 0 :(得分:1)
S3RemoteFileTemplate
功能list()
可以在handle()
中使用。split()
。然后S3MessageHandler
结果并为每个要下载的远程文件调用 constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
//actually this tempObj data is coming from backend
//after few loops i am assigning values like this
let tempObj = {
132284688949:{3: false,
5: true,
6: false},
262993790438:{3: false,
8: true,
11: false},
262993790440:{3: false,
8: true,
11: false}};
this.setState(tempObj);
console.log(this.state);
}
。
虽然最后一个具有下载整个远程目录的功能。
答案 1 :(得分:0)
对于遇到这个问题的人来说,这就是我所做的。诀窍是:
addFilters
或getFilters
方法,因此过滤器只能设置一次,以后无法添加。 @ artem-bilan,这很不方便。手动调用S3StreamingMessageSource.receive
。
.handle(String.class, (fileName, h) -> {
if (messageSource instanceof S3StreamingMessageSource) {
S3StreamingMessageSource s3StreamingMessageSource = (S3StreamingMessageSource) messageSource;
ChainFileListFilter<S3ObjectSummary> chainFileListFilter = new ChainFileListFilter<>();
chainFileListFilter.addFilters(
new S3SimplePatternFileListFilter("**/*/*.json.gz"),
new S3PersistentAcceptOnceFileListFilter(metadataStore, ""),
new S3FileListFilter(fileName)
);
s3StreamingMessageSource.setFilter(chainFileListFilter);
return s3StreamingMessageSource.receive();
}
log.warn("Expected: {} but got: {}.",
S3StreamingMessageSource.class.getName(), messageSource.getClass().getName());
return messageSource.receive();
}, spec -> spec
.requiresReply(false) // in case all messages got filtered out
)