3

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.

+0

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

Antwort

3

Spring MVC basiert auf der Servlet-API und blockiert hauptsächlich intern, sodass das Verhalten reaktiver Streams nicht genutzt werden kann. Schreibadapter für die Controller-Ebene reichen nicht aus.

Das Spring-Team arbeitet zu diesem Zweck an einer separaten Initiative. Folgen Sie SPR-14161 und dem Frühlingsblog (einschließlich this und this), um mehr über reaktive Quellen zu erfahren.