我正在尝试使用Spring WebFlux构建一个简单的聊天服务器。这很简单,只能作为例外工作。我现在想要实现的是在服务器端终止Flux流。想象一下,有一个无限的Flux暴露如下:
@GetMapping(produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<Object> join(@PathVariable String user)
我有10个客户端/订阅者连接到该事件流。现在我想终止一个特定客户端的连接,例如用户在聊天中诅咒。随你。是否可以管理/识别此类端点的订户?
答案 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.
这是一个简单的实现,但应该可以帮助您入门。