Micronaut Reactive HTTP Request Processing
Da Micronaut auf Netty basiert, ist es möglich, nicht blockierende E / A durchzuführen.
Reactive HTTP Request Processing
If your controller method returns a non-blocking type such as an RxJava Observable or a CompletableFuture then Micronaut will use the Event loop thread to subscribe to the result.
Wenn die Controller
-Methode das RxJava Observable
oder CompletableFuture
zurückgibt, verwendet sie den Event-Loop-Thread, um das Controller
-Ergebnis zu abonnieren.
If however you return any other type then Micronaut will execute your @Controller method in a preconfigured I/O thread pool.
Wenn ein anderer Typ zurückgegeben wird, wird der E / A-Thread-Pool verwendet.
Der Typ des Rückgabewerts von "Controller" ist wichtig.
Nun, es ist einfach, aber lass es uns benutzen.
Klicken Sie hier für diese Umgebung.
$ mn -V
| Micronaut Version: 1.0.4
| JVM Version: 1.8.0_191
Erstellen Sie vorerst ein Vorlagenprojekt.
$ mn create-app hello-reactive --build maven
$ cd hello-reactive
Lassen Sie die Klasse vorerst mit der Hauptmethode
src/main/java/hello/reactive/Application.java
package hello.reactive;
import io.micronaut.runtime.Micronaut;
public class Application {
public static void main(String[] args) {
Micronaut.run(Application.class);
}
}
Machen wir "Controller".
src/main/java/hello/reactive/HelloReactiveController.java
package hello.reactive;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Post;
import io.reactivex.Flowable;
import org.reactivestreams.Publisher;
@Controller("/reactive")
public class HelloReactiveController {
}
Schreiben wir den Inhalt der Methode.
Lassen Sie uns zunächst das Dokument überprüfen, um festzustellen, welcher Typ zurückgegeben werden soll.
org.reactivestreams.Publisher
Single
und Observable
java.util.concurrent.CompletableFuture
Es scheint so.
Darüber hinaus können Sie anscheinend "CompletableFuture" oder "Reactive" für das Argument der Methode verwenden.
Erstellen wir eine "text / event-stream" -Methode, die jede Sekunde eine Nachricht zurückgibt.
@Get(value = "/hello", produces = MediaType.TEXT_EVENT_STREAM)
public Publisher<String> hello() {
return Flowable
.fromArray("Hello Reactive")
.repeat(10)
.delay(1, TimeUnit.SECONDS)
.map(m -> String.format("[%s] %s", LocalDateTime.now(), m));
}
Als ich die Abhängigkeiten des erstellten Projekts überprüft habe, habe ich RxJava gefunden und dieses verwendet.
$ ./mvnw dependency:tree
[INFO] +- io.micronaut:micronaut-runtime:jar:1.0.4:compile
[INFO] | +- io.micronaut:micronaut-aop:jar:1.0.4:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.8:compile
[INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.8:compile
[INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.9.8:compile
[INFO] | +- io.reactivex.rxjava2:rxjava:jar:2.2.2:compile
Starten und überprüfen.
$ curl -i localhost:8080/reactive/hello
HTTP/1.1 200 OK
transfer-encoding: chunked
Date: Wed, 20 Feb 2019 13:00:07 GMT
transfer-encoding: chunked
content-type: text/event-stream
data: [2019-02-20T13:00:08.861] Hello Reactive
data: [2019-02-20T13:00:09.940] Hello Reactive
data: [2019-02-20T13:00:10.943] Hello Reactive
data: [2019-02-20T13:00:11.946] Hello Reactive
data: [2019-02-20T13:00:12.948] Hello Reactive
data: [2019-02-20T13:00:13.950] Hello Reactive
data: [2019-02-20T13:00:14.953] Hello Reactive
data: [2019-02-20T13:00:15.954] Hello Reactive
data: [2019-02-20T13:00:16.956] Hello Reactive
data: [2019-02-20T13:00:17.959] Hello Reactive
Irgendwie funktioniert es so.
Schreiben wir etwas, das Argumente akzeptiert.
@Post(value = "echo", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_EVENT_STREAM)
public Publisher<String> echo(@Body Flowable<String> text) {
return text.map(t -> "★" + t + "★");
}
Die Eingabe wird auch nicht gestreamt ...
$ curl -i -XPOST -H 'Content-Type: text/plain' localhost:8080/reactive/echo -d 'hello'
HTTP/1.1 200 OK
transfer-encoding: chunked
Date: Wed, 20 Feb 2019 13:01:29 GMT
transfer-encoding: chunked
content-type: text/event-stream
data: ★hello★
Ist es in Ordnung, Reactor in die Abhängigkeit zu setzen?
Vorerst konnte ich eine einfache Bestätigung geben.
Recommended Posts