我有一个现有的接口链,我想以reactor的身份运行,而不是管理自己的线程和队列
public interface UserLookupService {
public User lookup(String id);
}
public interface UsersHandler {
public void handle(List<User> users>);
}
UserLookupService userSvc = ...;
UsersHandler usersHandler = ...
// Works well to lookup users in parallel.
Flux.just("userA", "userB", "userC")
.parallel(2)
.runOn(Schedulers.parallel())
.subscribe(str -> {
userSvc.lookup(str);
});
如何链接该结果,以便它以成批UsersHandler
的方式调用User
?
答案 0 :(得分:2)
订阅某些内容会触发链,因此通常您不能“链接”订户,他们是链中的最后一环。
如果这样想,就可以设置响应式管道,并在subscribe
时触发管道启动,然后链会产生结果。
在网络服务器中,subscriber
通常是主叫客户端,当客户端subscribes
触发服务器中将发布数据的事件链时。
Flux
有点像1至n个Mono
的列表。可以这么说,Mono/Flux
中的每个对象都有许多“状态”。这些是Success
,Error
,Cancel
,Next
,Completed
等。
当Mono/Flux
内部进入Success
状态时,它将发出其中的值。当单声道中的某些问题解决后,Mono
通常会进入Success
。
当您声明Flux.just("userA", "userB", "userC")
时,基本上是在要求磁通解析输入的输入。放置字符串会立即解决,因此磁通将进入Success
状态,并在Subscribes
出现后立即开始发出字符串。因此,您要做的就是声明要在某人Subscribes
之后发生的链。
当您想做某事并更改值时,可以采用几种不同的方式来完成此操作,例如,您通常希望使用string
从user
到map
。
如果我们只想对每个对象做某事而不返回任何东西,我们可以使用doOnNext
。
Flux.just("userA", "userB", "userC")
.parallel(2)
.runOn(Schedulers.parallel())
.map(userString -> {
return lookupService.lookup(userString);
})
.doOnNext(user -> {
// if you want to do something on each user
// will return void so if you want to log something
// or handle each user
}).subscribe();
订阅应该是链中的最后一件事。