Spring 带有日期参数的MongoDb消息源

Spring 带有日期参数的MongoDb消息源,spring,spring-integration,Spring,Spring Integration,我的一个spring集成出现了问题。 我有一个spring集成,它处理来自SFTP服务器的文件,然后将它们留在服务器上。我使用mongodb元数据存储库,以便能够让多个实例无冲突地获取文件。 我想做的是: 进行mongo db查询,搜索修改日期在x和Y天之间的文件 删除那些文件 这一行动是由一名民意测验者发起的 我想做的是这样的: @Bean public IntegrationFlow processProduct() { return IntegrationFlows.from(

我的一个spring集成出现了问题。 我有一个spring集成,它处理来自SFTP服务器的文件,然后将它们留在服务器上。我使用mongodb元数据存储库,以便能够让多个实例无冲突地获取文件。 我想做的是:

  • 进行mongo db查询,搜索修改日期在x和Y天之间的文件
  • 删除那些文件
  • 这一行动是由一名民意测验者发起的
我想做的是这样的:

@Bean
public IntegrationFlow processProduct() {
    return IntegrationFlows.from(mongoMessageSource(mongoDbFactory),
            c -> c.poller(Pollers.cron(cron)))
            .enrichHeaders(m -> m.header("errorChannel", deleteFileErrorChannel))
            .split()
            .channel(deleteFileChannel())
            .get();
}


@Bean
public MessageSource<Object> mongoMessageSource(MongoDbFactory mongo) {
    long innerBoundary = Instant.now().toEpochMilli();
    long outerBoundary = Instant.now().plus(XXXXX).toEpochMilli();

    log.info("Delete file with modification date between {} and {}", outerBoundary, innerBoundary);
    String expression = new StringBuilder()
            .append("{value: { $gte: \"")
            .append(outerBoundary)
            .append("\", $lt : \"")
            .append(innerBoundary)
            .append("\"}}")
            .toString();
    log.info("Running mongo query {}", expression);

    MongoDbMessageSource messageSource = new MongoDbMessageSource(mongo, new LiteralExpression(expression));
    messageSource.setExpectSingleResult(false);
    messageSource.setEntityClass(MetaDataStore.class);
    messageSource.setCollectionNameExpression(new LiteralExpression("treated_file"));
    return messageSource;
}

@Bean
public IntegrationFlow deleteFileFlow() {
    return IntegrationFlows.from(deleteFileChannel())
            //Add file name and directory to header
            .enrichHeaders(m -> m
                    .header("file_remoteDirectory", sourceFtpDirectory)
                    .headerExpression("file_remoteFile", "payload.id")
            )
            //Delete files
            .handle(Sftp
                    .outboundGateway(
                            sourceFtpSessionFactory,
                            AbstractRemoteFileOutboundGateway.Command.RM,
                            "headers['file_remoteDirectory'] + '/' + headers['file_remoteFile']")
            )
            .get();
}
@Bean
公共集成流程processProduct(){
返回IntegrationFlows.from(mongoMessageSource(mongoDbFactory)),
c->c.poller(Pollers.cron(cron)))
.enrichHeaders(m->m.header(“errorChannel”,deleteFileErrorChannel))
.split()
.channel(deleteFileChannel())
.get();
}
@豆子
public MessageSource mongoMessageSource(MongoDbFactory mongo){
long innerBoundary=Instant.now().toEpochMilli();
long outerBoundary=Instant.now().plus(XXXXX.toEpochMilli();
log.info(“删除修改日期在{}和{}之间的文件”,outerBoundary,innerBoundary);
字符串表达式=新的StringBuilder()
.append(“{value:{$gte:\”)
.append(外部三元组)
.append(“\”,$lt:\”)
.append(内部边界)
.append(“\”}}”)
.toString();
info(“运行mongo查询{}”,表达式);
MongoDbMessageSource messageSource=新的MongoDbMessageSource(mongo,新的文字表达式(表达式));
messageSource.setExpectSingleResult(false);
messageSource.setEntityClass(MetaDataStore.class);
setCollectionNameExpression(新的文字表达式(“处理过的文件”);
返回消息源;
}
@豆子
公共集成流deleteFileFlow(){
从(deleteFileChannel())返回IntegrationFlows.from
//将文件名和目录添加到标题
.enrichHeaders(m->m
.header(“文件\远程目录”,sourceFtpDirectory)
.headerExpression(“file\u remoteFile”,“payload.id”)
)
//删除文件
.手柄(Sftp
.outboundGateway(
SourceFTPSSessionFactory,
AbstractRemoteFileOutboundGateway.Command.RM,
“标题['file\u remoteDirectory']+'/'+标题['file\u remoteFile']”)
)
.get();
}
问题在于,mongoMessageSource是一个bean,因此激发的查询总是相同的。 如何进行spring集成,每X次使用不同的参数值触发一个mongo查询,然后删除文件?
谢谢

你走对了,但是你应该考虑一些外部bean,每次轮询调用“代码”> MungDbMasigeSueCur.Access()/<代码> < < /P>时,都会为你返回一个新的查询。 我的意思是,
MongoDbMessageSource
的第二个参数必须类似于:

Expression expression = new SpelExpressionParser().parseExpression("@myQueryBean.getQuery()");
MongoDbMessageSource messageSource = new MongoDbMessageSource(mongo, expression);

其中,
myQueryBean
是一个具有适当逻辑的bean,可以在每次调用
getQuery()
时构建一个新的MongoDb查询。在我们的例子中,它是由
MongoDbMessageSource

@DamienWalle上的民意调查者完成的。您能发布您的solution@DamienWalle它很有魅力,非常感谢这个伟大的解决方案。我将很快发布我的完整解决方案,以帮助像edwin这样的其他人