终止服务器上的特定Flux流

时间:2017-12-21 22:51:09

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

我正在尝试使用Spring WebFlux构建一个简单的聊天服务器。这很简单,只能作为例外工作。我现在想要实现的是在服务器端终止Flux流。想象一下,有一个无限的Flux暴露如下:

@GetMapping(produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<Object> join(@PathVariable String user)

我有10个客户端/订阅者连接到该事件流。现在我想终止一个特定客户端的连接,例如用户在聊天中诅咒。随你。是否可以管理/识别此类端点的订户?

1 个答案:

答案 0 :(得分:1)

您可以使用.takeUntilOther(Publisher)运算符构建一些东西,并在断开用户连接时发出给定的Publisher

@GetMapping(produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<Object> join(@PathVariable String user) {
    return Flux.from(/* your logic to build your flux */)
               .takeUntilOther(disconnector.onDisconnectUser(user));
}

onDisconnectUser(String user)的一种可能的实现方式是过滤“全局”热Flux<String>,该热public class UserDisconnecter { private final FluxProcessor<String, String> processor; private final FluxSink<String> sink; public UserDisconnecter() { this.processor = DirectProcessor.create(); this.sink = this.processor.sink(); } /** * Signals that all existing streams for this user should be disconnected. */ public void disconnectUser(String user) { this.sink.next(user); } /** * Returns a Mono that emits when the given user should be disconnected. */ public Mono<String> onDisconnectUser(String user) { return processor .filter(user::equals) .next(); } } 发出用户名以断开给定用户名的连接。也许是这样的:

Theorem splitting_disjunctions_in_hypotheses : forall (n : nat),
  ((n < 5) \/ (n > 8)) -> ((n > 7) \/ (n < 6)).
Proof.
  intros n H1.
  destruct H1.

这是一个简单的实现,但应该可以帮助您入门。