Alle,kann AsyncHttpClient nicht blockierende asynchrone HTTP-Aufrufe ausführen?
Ich versuche zu entscheiden, ob ich NodeJS oder Java für meine Anwendung verwenden soll. Ich werde mit CouchDB über HTTP kommunizieren und möchte ein asynchrones, nicht blockierendes Design, bei dem mein Anwendungsthread zusätzliche Anforderungen verarbeiten kann, während er auf die Abfrageantwort von CouchDB wartet.
Ich würde lieber Java verwenden und ich habe AsyncHttpClient für ein paar Tage als eine mögliche Lösung betrachtet. Allerdings habe ich einige Schwierigkeiten, die Bibliothek zu verstehen und denke, dass ich ein grundlegendes Missverständnis von etwas habe.
gepostet ich einen Kern hier: https://gist.github.com/conorgil/5505603
ich diesen Kern auszudrucken erwarten würde „gesendet anfordern X!“ UND "Antwort X: etwas" für jede Anfrage. Es scheint jedoch, dass der HTTP-Aufruf nicht gemacht wird (und somit der Handler nicht ausgeführt wird), bis jeder Future get() aufruft. Das Unterkommentieren von Zeile 23 f.get() lässt den Code wie erwartet funktionieren, aber der Aufruf von Future # get() blockiert, richtig? Gibt es eine Möglichkeit, eine Callback-Funktion bereitzustellen, die ausgeführt wird, sobald die HTTP-Antwort vollständig abgerufen wurde, ohne zu blockieren?
So etwas wie das Folgende: 1) Anfrage kommt auf Hauptthread 2) asynchronen, nicht blockierenden HTTP-Anruf wird an CouchDB gemacht. Ein Completion-Handler registriert die Antwort von CouchDB 3) Der Haupt-Thread kann jetzt die nächste Anfrage bearbeiten 4) Die HTTP-Antwort von CouchDB kommt irgendwann und der registrierte Handler wird aufgerufen, um eine Geschäftslogik auszuführen. 0) main thread fährt nur mit der Verarbeitung von Anfragen fort (für Anfragen, die nicht auf CouchDB treffen müssen, können sie sehr schnell beantwortet werden)
Bin ich hier grundsätzlich falsch? Ist es möglich, diese Art von Sache in Java zu tun? Ist AsyncHttpClient die Antwort? Diese Frage hängt zusammen, ist aber nicht sicher, ob sich die Dinge seit 2011 geändert haben. (Perform Async Connect with Java AsyncHttpClient Library?)
Da NodeJS eine Ereignisschleife ausführt, ist dieses nicht blockierende asynchrone Verhalten Standard. Sie würden einfach eine Callback-Funktion registrieren, um die DB-Antwort zu behandeln, wenn sie empfangen wurde, und die Ereignisschleife würde in der Zwischenzeit nur andere Dinge verarbeiten.
Alle und alle Ratschläge sind willkommen.
Danke, Conor
Ja ist es. Werfen Sie einen Blick auf vert.x –
node.js ist ziemlich anständig als ein leichtes Reverse-Proxy/Gateway mit geringer App-Logik mit couchdb einfach wegen Couch http-Schnittstelle und Knoten ist einfach async http gebacken in. Java ist performativer für schwere App-Logik. –