MrKulli:
春反応性フラックスの間隔を使用してプッシュ彼らはフラッシュ後の準備/利用可能と近い接続されたときに上流へのメッセージではなく、メッセージのポーリングしようとしています。
@GetMapping(value = "/getValue/{randomId}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> statusCheck(@PathVariable("randomId") @NonNull String randomId) {
return Flux.<String>interval(Duration.ofSeconds(3))
.map(status -> {
if (getSomething(randomId).
equalsIgnoreCase("value"))
return "value";
return "ping";
}).take(Duration.ofSeconds(60)).timeout(Duration.ofSeconds(60));
}
カフカリスナーは、マップ内の間隔でランダムID値のための方法チェックをgetSomething、につれてマップにランダムID値を更新します。だからではなく、間隔でチェックし、マップ内のデータを格納する、私は、リスナーが受信したときにクライアントにメッセージをプッシュします。
MrKulli:
私は、このstackoverflowのに基づくソリューションを構築し、イベントストリームへのMessageListenerを埋めるためにEmitterProcessorを使用する方法-ホット出版-春5のWeb反応、答え、彼らが利用できるよう熱いメッセージを公開するEmitterProcessorを使用しました。
ここではサンプルコードはあります
@GetMapping(value = "/getValue/{randomId}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> statusCheck(@PathVariable("randomId") @NonNull String randomId) {
EmitterProcessor<String> emitterProcessor = EmitterProcessor.create();
Flux<String> autoConnect = emitterProcessor.publish().autoConnect();
FluxSink<String> sink = emitterProcessor.sink();
//storing randomId and processor sink details
randomIdMap.putIfAbsent(randomId, emitterProcessor);
/** This will return ping status to notify client as
connection is alive until the randomId message received. **/
sendPingStatus(sink, randomId);
}
それはカフカの消費者と密接なフラックスの接続に到着すると、クライアントにプッシュメッセージにどのようにメソッドショーの下に。
@KafkaListener(topics = "some-subscription-id",
containerFactory = "kafkaListenerContainerFactory")
public void pushMessage(SomeMessage message, Acknowledgment acknowledgment) {
EmitterProcessor emitter = randomIdMap.get("randomId");
if (emitter != null ) {
emitter.onNext(message);
emitter.onComplete();
randomIdMap.remove("randomId");
acknowledgment.acknowledge();
}
}