我使用SpringBoot和Webflux的反应式编程。我想重复对endpoint的一些调用,直到数据可用为止(将返回一些内容)。
我想调用commandControllerApi。findById
直到displayCommand返回状态为==SUCCESS
。如何告诉Webflux我的链的这一部分应该被调用5次,例如,因为我的数据库中的数据应该在5-10秒后出现。。。
我认为当前代码会导致再次调用整个链,而不仅仅是调用我链的适当部分(.flatMap(commandResponse))-
我的代码:
public Mono<Boolean> validateCredentials(FlowConfCredentials flowCredentials, UUID agentId) {
return securityService
.getUser()
.flatMap(
user -> {
Command command = new Command ();
command.setAgentId(agentId.toString());
command.setCommandType(COMMAND_TYPE);
command.setArguments(createArguments());
command.setCreatedBy(
user.getEmail());
return commandControllerApi.saveCommand(command);
})
// .retryWhen(Retry.fixedDelay(5, Duration.ofSeconds(5)))
.flatMap(commandResponse -> commandControllerApi.findById(commandResponse.getCommandId()))
.filter(displayCommand -> displayCommand.getStatus().equals(OaCommandStatus.SUCCESS))
.retryWhen(Retry.fixedDelay(5, Duration.ofSeconds(5)))
// .repeatWhenEmpty(
// Repeat.onlyIf(repeatContext -> true)
// .exponentialBackoff(Duration.ofSeconds(5), Duration.ofSeconds(5))
// .timeout(Duration.ofSeconds(30)))
.filter(
commandResponse ->
commandResponse.getStatus() != null
&& commandResponse.getStatus().equals(CommandStatus.SUCCESS))
.map(commandResponse -> true)
.switchIfEmpty(Mono.just(false));
}
下面是调用上面的metohd的方法:
public Flux<CredConfiguration> saveCredentials(
Mono<FlowConfCredentials> flowCredentials, UUID agentId) {
return flowCredentials
.filterWhen(cred -> validationService.validateCredentials(cred, agentId))
.flatMapMany(
flowConfCredentials -> {
if (condition1()) {
return caveCredentials(flowConfCredentials);
}
if (condition2()) {
return saveCredentialsForUser(flowConfCredentials.getExistingCredentials());
}
return Flux.error(new EmptyConfigurationException(CREDENTIALS_MESSAGE));
});
}
要仅重复订阅findById返回的mono而不重新订阅上游saveCommand/getUser,请将筛选器/repeatWhenEmpty移动到调用findById的flatMap中。
public Mono<Boolean> validateCredentials(FlowConfCredentials flowCredentials, UUID agentId) {
return securityService
.getUser()
.flatMap(
user -> {
Command command = new Command();
command.setAgentId(agentId.toString());
command.setCommandType(COMMAND_TYPE);
command.setArguments(createArguments());
command.setCreatedBy(
user.getEmail());
return commandControllerApi.saveCommand(command);
})
.flatMap(saveResponse -> commandControllerApi.findById(saveResponse.getCommandId())
.filter(findResponse -> findResponse.getStatus().equals(OaCommandStatus.SUCCESS))
.repeatWhenEmpty(
Repeat.onlyIf(repeatContext -> true)
.exponentialBackoff(Duration.ofSeconds(5), Duration.ofSeconds(5))
.timeout(Duration.ofSeconds(30))))
.hasElement();
}
问题内容: 这个问题已经在这里有了答案 : 我应该在MySQL中使用datetime或timestamp数据类型吗? (39个答案) 6年前关闭。 我已经搜索了此文件,但没有明确的答案(尤其是后者)。在什么情况下应该使用日期时间或时间戳记? 问题答案: 假设您使用的是MS SQL Server(不是,请参见 下面 的 更新 ): 一个表只能有一个时间戳列。每次插入或更新包含时间戳列的行时,都会更新
问题内容: 我想做的是在有webclient的Webflux中的Mono上有条件地重复。情况如下: 我们有一些商务休息服务服务,可返回生成的文档。此文档的生成是由在此之前调用的另一服务触发的。但是,回到正题:文档生成服务需要10到30秒。我们想要做的是:10秒钟后检查是否生成文档(单声道)。如果是这样,一切都很好。如果不是,请在5秒钟后重复(或重试)并检查是否生成了文档。依此类推,直到(最坏的情况
我要做的是用WebClient对Webflux中的单声道进行有条件的重复。情况如下: 我们有一些返回生成文档的业务rest服务。此文档的生成是从在此文档之前调用的另一个服务触发的。但是,回到业务:文档生成服务需要10-30秒。我们要做的是:10秒后检查是否生成了文档(单)。如果是这样,一切都很好。如果没有,请在5秒后重复(或重试)并检查是否生成了文档。以此类推,直到(最坏的情况)30秒后超时。这可
我正试图找出处理异常的最具Python风格的方法。假设我们有一个长方法,它可以完成多个注册汽车的任务 例如 检索汽车详细信息 计算税款 发送确认电子邮件 调用方法是否应该处理异常: 或者单个方法本身是否应该处理异常。如果在这个方法中有任何异常,我们只想记录下来(或者在这个例子中打印出来)并继续。 是一种方法比另一种方法更pythonic,还是归结为更具可读性?我更喜欢第二种方式,但我们似乎更频繁地
问题内容: 我正在尝试保存要分析的歌曲信息,但是如果该歌曲已经存在于分析中,我希望我的代码什么也不做。 我在下面尝试过此代码: 上面的代码在日志中给出以下结果: 成功取得4分。歌曲已存在成功检索到4个乐谱。歌曲已存在成功检索到4个乐谱。歌曲已存在成功检索到4个乐谱。歌曲已存在成功成功成功成功成功成功成功成功成功成功成功成功 为什么我的for循环比Objects.count循环更多?以及如何防止解析