J'ai la situation suivante: J'essaie d'implémenter une servlet d'interrogation longue en java (va fonctionner sur jetty). J'utilise AsyncContext et TimerTask pour y parvenir."Le Locker n'est pas réentrant" dans la servlet java java asynchrone long polling
J'ai une classe de session qui a cette méthode:
public boolean setLongPollingContext(final AsyncContext ctx) {
if (ctx==null)
return false;
this.longPollContext = ctx;
this.alertHandler = new AlertNotificationHandler() {
@Override
public void onNewAlert() {
}
@Override
public void onTimeout() {
System.out.println("*** timeout ***");
HttpServletResponse response = (HttpServletResponse)ctx.getResponse();
response.setStatus(408); // timeout
try {
response.getWriter().write("Timeout");
} catch (IOException e) {
e.printStackTrace();
}
ctx.complete();
}
};
this.alertHandler.setTimeout(this.longPollingInterval); // 31 seconds
return true;
}
(setTimeout commence juste un fil de minuterie qui appelle "onTimeout" en 31 secondes)
J'appelle comme ceci:
final AsyncContext asyncCtx = request.startAsync(request, response);
session.setLongPollingContext(asyncCtx);
Cela a fonctionné correctement en moins de 30 secondes (ce qui est, semble-t-il, le délai par défaut du thread ssl/http dans jetty 9.3).
Plus de 30 secondes, je recevais problème lié au délai d'attente que je fixe en réglant cette ligne dans mon Apaisez/start.d/fichier ssl.ini:
## Connector idle timeout in milliseconds
jetty.ssl.idleTimeout=330000
Je ne reçois pas le problème de délai d'attente plus , mais maintenant j'ai quelque chose d'encore plus bizarre:
Exception in thread "Timer-0"
java.lang.IllegalStateException: Locker is not reentrant
at org.eclipse.jetty.util.thread.Locker.concLock(Locker.java:85)
at org.eclipse.jetty.util.thread.Locker.lock(Locker.java:61)
at org.eclipse.jetty.server.HttpChannelState.getStatusString(HttpChannelState.java:166)
at org.eclipse.jetty.server.HttpChannelState.complete(HttpChannelState.java:481)
at org.eclipse.jetty.server.AsyncContextState.complete(AsyncContextState.java:92)
at com.theobroma.paranoidandroid.session.ProxyClientSession$1.onTimeout(ProxyClientSession.java:60)
at com.theobroma.paranoidandroid.session.AlertNotificationHandler$1.run(AlertNotificationHandler.java:25)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
Google n'a pas réussi à me donner des vecteurs pertinents à ce sujet.
Y a-t-il autre chose que je dois configurer dans la jetée?
est-il un moyen de définir ces options de configuration sans modifier les fichiers de configuration (à partir du code, comme avec annotations ou fixer quelques variables statiques?)
Merci!
Pourquoi implémentez-vous le délai d'attente par vous-même et n'utilisez pas les délais d'attente intégrés dans AsyncContext? –
Eh bien, surtout parce que je voulais être capable de faire des choses sur le timeout. Je ne sais pas si c'est possible avec les built-ins, mais c'était très utile car apparemment le timer intégré était celui qui a expiré et invalidé mon flux de sortie de réponse. Donc régler le timeout à longPollingInterval + quelque chose a résolu le problème, merci! –
Si vous souhaitez en faire une réponse, je peux l'accepter et d'autres personnes peuvent le voir plus facilement :) –