我正在访问使用 OpenID 连接保护的外部 REST API。我必须运行一个在完成之前多次调用 api 的作业。该作业可以使用多个并发线程并行执行。因此,我使用为每个作业实例化的 api 访问服务:
private AccessAndRefresTokens tokens; // I initially get that from somewhere else
public Mono<Result> callTheApi(){
return createWebClientWith(tokens.accessToken).executeRequest();
}
public Mono<Result> callOtherApiFunction(){
return createWebClientWith(tokens.accessToken).executeRequest();
}
public Mono<Result> callYetAnotherApiFunction(){
return createWebClientWith(tokens.accessToken).executeRequest();
}
Run Code Online (Sandbox Code Playgroud)
当我的作业执行时,访问令牌可能会在两次 api 调用之间过期。为了防止这种情况发生,我喜欢在每次请求之前检查访问令牌的有效性,并在必要时刷新它。
我的第一个想法是在 flatMap 运算符内进行有效性检查:
Mono.just(tokens).flatMap(tokens -> {
if(accessTokenExpired){
return refreshAccessToken().doOnNext(refreshedTokens -> tokens = refreshedTokens);
}else{
return Mono.just(tokens.accessToken);
}
}).flatMap(accessToken -> createWebClientWith(accessToken));
Run Code Online (Sandbox Code Playgroud)
然而,在我看来,如果多个线程访问服务并且刷新尚未完成,这将多次触发刷新。因此,我最终会在很短的时间内多次刷新访问令牌,这可能会由于速率限制而失败。
我对整个反应性事物很陌生,我认为使用synchronized块不是一个理想的选择。所以我试图用反应堆找出一些东西Processor,但我找不到令人满意的解决方案。
那么有没有办法确保访问令牌仅被引用一次?以及如何在不使用阻塞代码的情况下实现这一目标?
关于FX,CSS和TreeTableView,我遇到了一些麻烦.我有包含蓝色超链接的单元格.现在,如果选择了单元格,则背景变为蓝色,因此链接几乎不可见.我现在想用Stylesheets更改所选单元格的背景颜色.
对于TreeView,以下工作正常:
.tree-view .tree-cell:selected{
-fx-background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
所以类似地我试过:
.tree-table-view .tree-table-cell:selected{
-fx-background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
但这没有效果.令人惊讶的是,虽然我能够改变一般的背景颜色:
.tree-table-view .tree-table-cell{
-fx-background-color: yellow;
}
Run Code Online (Sandbox Code Playgroud)
细胞现在都是黄色的,但这似乎覆盖了默认的选择模式,因为现在即使选择的行也有黄色背景.
对我来说,似乎状态选择器不适用于TreeTableView单元格,但我不知道如何以另一种方式实现.
我还尝试使用JavaFX文档中的示例15-2,获得了相同的不满意结果.
我无法在网上找到任何解决方案,因为所有问题似乎都是关于TreeViews或TableViews而不是组合的TreeTableView.所以任何提示或链接到正确的文档将是非常有帮助的!
提前致谢!
PS:我知道可以通过改变超链接的颜色来解决这个问题但是必须有办法改变单元格的颜色,对吗?
我正在使用 Spring 5 WebClient 从 REST api 重复获取正在运行的进程的某些状态。
在这里的帮助下,我现在来到了这个解决方案:
webClient.get().uri(...).retrieve.bodyToMono(State.class)
.repeat()
.skipUntil(state -> stateFinished())
.limitRequest(1)
.subscribe(state -> {...});
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但 get 请求以非常高的速率被触发。将请求速率限制为每秒 1 个请求的正确方法是什么?
我尝试使用,delayElements(Duration.ofSeconds(1))但这只会延迟结果,而不是请求本身。