[英]Kinesis as producer in Spring Boot Reactive Stream API
我正在嘗試構建一個小的Spring Boot Reactive API。 API應該讓用戶訂閱一些數據,以SSE形式返回。
數據位於Kinesis主題上。
創建Reactive API和Kinesis的StreamListener相當簡單-但我可以將它們組合在一起,因此Kinesis Topic用作數據服務使用的事件流的生產者。
該代碼看起來或多或少像這樣
//Kinesis binding, with listenerMode: rawRecords
@EnableBinding(Sink.class)
public class KinesisStreamListener {
@StreamListener(value = Sink.INPUT)
public void logger(List<Record> payload) throws Exception {
}
}
@RestController
@RequestMapping("/data")
public class DataResource {
@Autowired
DataService service;
@GetMapping(produces = {MediaType.TEXT_EVENT_STREAM_VALUE, MediaType.APPLICATION_STREAM_JSON_VALUE})
public Flux<EventObject> getData() {
return service.getData();
}
}
@Component
public class DataService {
Flux<EventObject> getData() {
Flux<Long> interval = Flux.interval(Duration.ofMillis(1000));
Flux<EventObject> dataFlux = Flux.fromStream(Stream.generate(() -> ???
));
return dataFlux.zip(interval, dataFlux).map(Tuple2::getT2);
}
}
這是我如何執行此操作的示例: https : //github.com/artembilan/sandbox/tree/master/cloud-stream-kinesis-to-webflux 。
一旦我們就細節和一些改進達成共識,可以轉到官方的Spring Cloud Stream Samples存儲庫: https : //github.com/spring-cloud/spring-cloud-stream-samples
主要思想是通過Spring Cloud Stream Reactive Support重用@StreamListener
提供的相同Flux
。 這已經是FluxPublish
,因此任何新的SSE連接都將作為普通的Reactive訂戶使用。
有幾個技巧可以計數:
listenerMode: rawRecords
,我們還需要配置contentType: application/octet-stream
以避免在Binder將消息發送到Sink.INPUT
通道時進行任何轉換嘗試。 listenerMode: rawRecords
返回一個List<Record>
我們的Flux
在@StreamListener
方法應該想到正是這種類型,而不是一個簡單的Record
。 這兩個問題都被視為對框架的改進。
因此,現在讓我們看看它的外觀和工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.