ich habe eine RESTful api-anwendung auf feder mvc.feder mvc integriere mit reaktivstrom
vor kurzem habe ich etwas Integration zwischen Feder mvc und reaktiven Strom (wie rxjava und Projekt-Reaktor) und versuchen, die Anwendung reaktiver zu machen.
ich habe nur einige Demo wie darunter bauen:
1.for rxjava, ich benutze PublishSubject
private SerializedSubject<StreamResult, StreamResult> subject = PublishSubject.<StreamResult>create().toSerialized();
public ReactiveStreamController() {
this.subject.subscribe(streamResult -> {
String id = streamResult.getRequest().getParameter("id");
System.out.println("[" + Thread.currentThread().getName() + "] request received. id = " + id);
String random = StringUtils.isBlank(id) ? StringUtils.EMPTY : id;
ResponseVO vo = new ResponseVO(200, "success = " + random);
streamResult.getFuture().complete(vo);
}, Throwable::printStackTrace);
}
@ResponseBody
@RequestMapping(value = "/rxJava", method = RequestMethod.GET)
public CompletableFuture<ResponseVO> rxJavaController(HttpServletRequest httpServletRequest) {
StreamResult sr = new StreamResult();
sr.setRequest(httpServletRequest);
subject.onNext(sr);
return sr.getFuture();
}
2.for Projekt Reaktor
@ResponseBody
@RequestMapping(value = "/reactorCodeNew", method = RequestMethod.GET)
public CompletableFuture<ResponseVO> reactorCoreNewParadigm(HttpServletRequest servletRequest) {
Mono<ResponseVO> mono = Mono.just(servletRequest)
.subscribeOn(executorService)
.map(request -> {
String id = request.getParameter("id");
System.out.println("[" + Thread.currentThread().getName() + "] request received. id = " + id);
String random = StringUtils.isBlank(id) ? StringUtils.EMPTY : id;
ResponseVO vo = new ResponseVO(200, "success = " + random);
return vo;
})
.timeout(Duration.ofSeconds(2), Mono.just(new ResponseVO(500, "error")));
return mono.toCompletableFuture();
}
beim Laufen sowohl die Demos , ich sehe nicht wirklich zu viel Unterschied zwischen der Verwendung eines Javas CompletableFuture, um unter der Controller-Methode zu liefern.
was ich reactive Stream verstehe und was ich will ist die Behandlung der Servlet-Anfrage als Stream und cosume es mit einigen Funktionen wie Gegendruck.
Ich möchte wissen: 1. Gibt es einen besseren Weg, um die Anwendung reaktiver zu machen? 2. ist es korrekt oder kompatibel, um feder-mvc mit reaktiven strömen zu integrieren? Wenn ja, wie kann ich eine Funktion wie Gegendruck ausführen?
ich erkenne vielleicht ich habe vergessen zu erklären, warum/wie ich eine completablefuture in der controller zurück, tatsächlich injiziere ich einen benutzerdefinierten MethodReturnValueHandler die CompleableFuture zu DefferdResult zu transformieren.
Vor kurzem Posted Frühling Blog auf genau dies: https://spring.io/blog/2016/07/20/notes-on-reactive-programming-part-iii-a-imple-http-server-application – Will