如何链接反应堆订户

时间:2019-07-01 14:56:48

标签: java spring spring-boot project-reactor reactor

我有一个现有的接口链,我想以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

1 个答案:

答案 0 :(得分:2)

订阅某些内容会触发链,因此通常您不能“链接”订户,他们是链中的最后一环。

如果这样想,就可以设置响应式管道,并在subscribe时触发管道启动,然后链会产生结果。

在网络服务器中,subscriber通常是主叫客户端,当客户端subscribes触发服务器中将发布数据的事件链时。

Flux有点像1至n个Mono的列表。可以这么说,Mono/Flux中的每个对象都有许多“状态”。这些是SuccessErrorCancelNextCompleted等。

Mono/Flux内部进入Success状态时,它将发出其中的值。当单声道中的某些问题解决后,Mono通常会进入Success

当您声明Flux.just("userA", "userB", "userC")时,基本上是在要求磁通解析输入的输入。放置字符串会立即解决,因此磁通将进入Success状态,并在Subscribes出现后立即开始发出字符串。因此,您要做的就是声明要在某人Subscribes之后发生的链。

当您想做某事并更改值时,可以采用几种不同的方式来完成此操作,例如,您通常希望使用stringusermap

如果我们只想对每个对象做某事而不返回任何东西,我们可以使用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();

订阅应该是链中的最后一件事。