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