[英]Dynamically trigger existing Flux from another API end point - Spring Webflux
我正在嘗試使用 web-flux 構建一個微服務,它將根據特定訂閱者的事件發送/發布一些數據。
通過以下實現( 另一個 Stackflow 問題),我可以創建一個發布者,當我們通過調用“/發送”API 觸發事件時,所有訂閱者都將自動接收數據
@SpringBootApplication
@RestController
public class DemoApplication {
final FluxProcessor processor;
final FluxSink sink;
final AtomicLong counter;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
public DemoApplication() {
this.processor = DirectProcessor.create().serialize();
this.sink = processor.sink();
this.counter = new AtomicLong();
}
@GetMapping("/send/{userId}")
public void test(@PathVariable("userId") String userId) {
sink.next("Hello World #" + counter.getAndIncrement());
}
@RequestMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent> sse() {
return processor.map(e -> ServerSentEvent.builder(e).build());
}
}
問題陳述 - 我的應用程序具有基於用戶的訪問權限,並且對於每個用戶,都會有一些我只想基於事件推送的通知。 在這里,事件將使用用戶 ID 存儲在數據庫中,當我們從另一個 API 以及“userId”作為路徑變量點擊“發送”端點時,它應該只發送與該用戶相關的數據,前提是它已注冊作為訂閱者並仍在收聽頻道。
這不是一個准確或實際的解決方案,但這個東西有效:首先是 SSE 端點:
@RestController
public class SSEController {
private String value = "";
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@GetMapping(path = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
Flux<String> getWords() {
System.out.println("sse ?");
return Flux.interval(Duration.ofSeconds(1))
.map(sequence -> getValue());
}
}
從任何服務或任何可以自動裝配的地方,只需自動裝配它:
@Service
public class SomeService {
@Autowired
private SSEController sseController;
...
void something(){
....
sseController.setValue("some value");
....
}
這是我正在使用的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.