2016-06-24 8 views
1

Hier sind zwei Links, die sich scheinbar widersprechen. Ich hatte Vertrauen früher die Dokumentation:Multithreading mit Jersey

Link 1

Request-Verarbeitung auf dem Server standardmäßig funktioniert in einem synchronen Verarbeitungsmodus

Link 2

Es ist bereits multithreaded.

Meine Frage:

Was ist richtig. Kann es sowohl synchron als auch multithread sein?

Warum sagt die Dokumentation der folgende ?:

in Fällen, in denen eine Ressource Methodenausführung bekannt, ist eine lange Zeit in Anspruch nimmt Ergebnis serverseitige asynchrones Verarbeitungsmodell verwendet werden soll, berechnen

Wenn die Dokumente korrekt sind, warum ist die Standardaktion synchron? Alle Anfragen sind asynchron auf clientseitigem Javascript standardmäßig für die Benutzererfahrung, es wäre dann sinnvoll, dass die Standardaktion für serverseitige ebenfalls asynchron sein sollte.

Wenn der Client Anforderungen in einer bestimmten Reihenfolge nicht zu bedienen braucht, wen kümmert es, wie "EXPENSIVE" der Vorgang ist. Sollten nicht alle Operationen einfach asynchron sein?

Antwort

7

Request-Verarbeitung auf dem Server arbeitet standardmäßig in einem synchronen Verarbeitungsmodus

Jede Anfrage auf einem separaten Thread verarbeitet wird. Die Anforderung wird als synchron betrachtet, da diese Anforderung den Thread solange aufhält, bis die Verarbeitung der Anforderung abgeschlossen ist.

Es ist bereits Multithread.

Ja, der Server (Container) ist multi-threaded. Für jede eingehende Anfrage wird ein Thread aus dem Thread-Pool genommen und die Anfrage wird an die bestimmte Anfrage gebunden.

in Fällen, in denen ein Ausführungsressource Verfahren bekannt ist, eine lange Zeit in Anspruch nimmt Ergebnis serverseitige asynchrones Verarbeitungsmodell verwendet werden soll,

Ja, zu berechnen, so dass wir bis nicht halten der Behälterfaden. Es gibt nur so viele Threads im Container-Thread-Pool, um Anfragen zu bearbeiten. Wenn wir sie alle mit langen Verarbeitungsanforderungen halten, kann der Container keine Threads mehr haben und andere Anfragen blockieren. Bei der asynchronen Verarbeitung übergibt Jersey den Thread an den Container zurück und bearbeitet die Anfrage, die sich selbst verarbeitet Thread-Pool, bis der Prozess abgeschlossen ist, dann senden Sie die Antwort an den Container, wo sie es zurück an den Client senden können.

Wenn der Client Anforderungen in einer bestimmten Reihenfolge nicht zu bedienen braucht, wen kümmert es, wie "EXPENSIVE" der Vorgang ist.

Nicht wirklich sicher, was der Kunde mit irgendetwas hier zu tun hat. Oder zumindest im Zusammenhang damit, wie du die Frage stellst. Es tut uns leid.

Sollten nicht alle Operationen einfach asynchron sein?

Nicht unbedingt, wenn alle Anfragen schnell sind. Obwohl Sie dafür argumentieren könnten, aber das würde Leistungstests erfordern, und Zahlen, die Sie gegeneinander austragen können und eine Entscheidung von dort treffen. Jedes System ist anders.

+0

@peeskillet Nur neugierig- wie viele Fäden verwendet der Jersey-Container standardmäßig? –