官术网_书友最值得收藏!

Exposing the SSE endpoint

To expose the SSE endpoint, we need a REST controller that is autowired with the TemperatureSensor instance. The following code shows the controller, which utilizes RxSeeEmitter:

@RestController
public class TemperatureController {
private final TemperatureSensor temperatureSensor; // (1)

public TemperatureController(TemperatureSensor temperatureSensor) {
this.temperatureSensor = temperatureSensor;
}

@RequestMapping(
value = "/temperature-stream",
method = RequestMethod.GET)
public SseEmitter events(HttpServletRequest request) {
RxSeeEmitter emitter = new RxSeeEmitter(); // (2)

temperatureSensor.temperatureStream() // (3)
.subscribe(emitter.getSubscriber()); // (4)

return emitter; // (5)
}
}

The TemperatureController is the same Spring Web MVC @RestController as before. It holds a reference to the TemperatureSensor bean (1). When a new SSE session is created, the controller instantiates our augmented RxSeeEmitter (2) and subscribes to the RxSeeEmitter subscribers (4) to the temperature stream referenced from the TemperatureSensor instance (3). Then the RxSeeEmitter instance is returned to the Servlet container for processing (5).

As we can see with RxJava, the REST controller holds less logic, does not manage the dead SseEmitter instances, and does not care about synchronization. In turn, the reactive implementation manages the routine of the TemperatureSensor's values, reading, and publishing. The RxSeeEmitter translates reactive streams to outgoing SSE messages, and TemperatureController only binds a new SSE session to a new RxSeeEmitter that is subscribed to a stream of temperature readings. Furthermore, this implementation does not use Spring's EventBus, so it is more portable and can be tested without initializing a Spring context.

主站蜘蛛池模板: 浦东新区| 淮滨县| 若羌县| 婺源县| 汝城县| 丹凤县| 彭泽县| 大埔区| 台江县| 沁源县| 普定县| 扶余县| 宝应县| 普格县| 莎车县| 荥经县| 衡南县| 松阳县| 仙桃市| 交城县| 东源县| 会同县| 苏尼特右旗| 常熟市| 宣武区| 武穴市| 延庆县| 临澧县| 青河县| 锦州市| 宁化县| 民权县| 三亚市| 天等县| 永城市| 潞西市| 富顺县| 搜索| 葵青区| 孝昌县| 石景山区|