簡體   English   中英

從另一個 API 端點動態觸發現有通量 - Spring Webflux

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM