So aktualisieren Sie Filter, um Servlet 3.0 asynchrones Servlet zu unterstützen

8

Ich habe ein Servlet, das verwendet wird, um Daten von vielen REST-Datenpunkten von Drittanbietern zu holen, alle Daten zu integrieren und die Daten in einem HTML-Format zu melden. Ich habe auch einen Filter, der den folgenden Ablauf hat -

  1. Erstellen Sie einen Ereignisdatensatz, wenn die Anfrage den Filter trifft und fügen Sie das Ereignisrecord-Objekt der Anfrage hinzu
  2. Führen Sie chain.doFilter aus. Dadurch kann das Servlet dem Ereignisbericht weitere Details hinzufügen.
  3. Auf dem Weg zurück zum Browser ruft filter das Ereignisrecord-Objekt auf und protokolliert es.

Wenn ich jetzt asynchrones Servlet mit AsyncContext context = request.getAsyncContext(); verwende, das mit den gleichen REST-Datenpunkten kommuniziert, aber wenn die Daten bereit sind, schreibt es in den Antwortdatenstrom anstatt darauf zu warten, dass alle REST-Datenpunkte darauf antworten Würde ich meinen Filter schreiben? Wird es an den Thread angehängt, der dafür verantwortlich ist, Daten von den REST-Datenpunkten zu löschen, so dass nach dem Verarbeiten aller Daten die Ereignisaufzeichnung protokolliert wird? Gibt es ein allgemeines Muster, das ich untersuchen kann, um zu verstehen, wie solche Anwendungsfälle mit Servlet 3.0's asynchronen Servlets gehandhabt werden können? Ich verwende JDK 6.0, Tomcat 7.0.

    
Shamik 28.05.2012, 21:50
quelle

3 Antworten

7

Fügen Sie einfach @WebFilter(urlPatterns = {"/*" }, asyncSupported = true) in web-xml für Ihren Filter hinzu.

Oder fügen Sie <async-supported>true</async-supported>

hinzu     
Tim 04.07.2012 12:02
quelle
0

Ich habe ein Kopfgeld ausgegeben, da ich selbst nicht sicher bin, wie man Geräte- oder Diagnosefilter richtig unterstützt (zB Codahales Metriken filtert ).

Wenn Sie <async-supported>true</async-supported> zu Ihren Filtern hinzufügen, werden diese mit Sicherheit funktionieren, es kann jedoch nicht die erwarteten Ergebnisse liefern (im Falle von Metriken werden alle Ihre Anfragen sehr schnell erscheinen).

Es scheint eine gute Idee zu sein, den AsyncContext sofort in den Filter zu bekommen, um metrische Daten zu binden aber verschiedene Container haben anscheinend Probleme damit und ich glaube Frameworks wie Spring haben auch Probleme (das könnte nur mein älterer sein Version von Frühling). Das heißt, dass die meisten Frameworks erwarten, dass die erste Hälfte der Request-Behandlung synchron ist (ich mag das möglicherweise massiv falsch).

Folglich scheint es, als wäre der einzige narrensichere Weg, Filter auf der Framework-Ebene zu integrieren. Zum Beispiel bietet Spring org.springframework.web.context.request.async.DeferredResultProcessingInterceptor , was etwas analog zu den AsyncContext-Ereignissen ist.

Dies ist etwas unglücklich, da nicht alle Anfragen vom Web-Framework bearbeitet werden, aber es gibt auch einen Unterschied zwischen der Bearbeitung des ersten Teils der Anfrage und der tatsächlichen Erfüllung (das sind jetzt zwei Metriken, die Sie überwachen möchten). p>     

Adam Gent 07.07.2016 16:30
quelle
0

@WebFilter Annotation wurde in Java EE 6 eingeführt. Es definiert verschiedene Elemente wie filterName, asyncSupported und servletNames usw. @WebFilter kann nicht ohne web.xml verwendet werden, da @WebFilter keine Reihenfolge definiert. @WebFilter reduziert die andere Konfiguration in web.xml.

%Vor%     
Pavan 14.07.2016 08:10
quelle