2017-10-04 1 views
0

J'essaie de créer une servlet asynchrone, afin que le client fasse une requête, obtienne une réponse comme "processus démarré" et arrête d'attendre. La servlet va commencer un calcul et écrire le résultat sur une base de données, puis l'utilisateur sera en mesure de vérifier si le processus est terminé et de voir son résultat.Fermez la requête et lancez le calcul asynchrone en Java

Eh bien, chaque fois que j'essaie de le faire un obtenir des erreurs. Dans la requête j'ai un objet Connection, et si je le passe à un Thread puis le démarre, quand la servlet principale se termine, la connexion se ferme et le Thread lance une Exception ('la connection est déjà fermée').

Existe-t-il un moyen de donner une réponse au client et lui dire de ne plus attendre pendant que le servlet fait tout son travail?

Merci d'avance!

+0

Veuillez partager votre code. –

+0

@chade quel code dois-je partager? Je demande une façon de faire quelque chose, pas pour une solution à une erreur ... –

+0

Vous pouvez demander à votre client de faire la requête asynchrone, en utilisant Ajax ou une technologie similaire. Quand il y a un resposne, le callback machanism sera utilisé pour l'obtenir. – breezee

Répondre

0

Si vous mentionniez une connexion DB, pourquoi ne pas créer la connexion à l'intérieur de votre thread?

+0

Parce que je n'ai pas le mot de passe pour la connexion. Je travaille sur un grand projet pour ma société avec beaucoup de problèmes de sécurité. Ce serait bien s'il y avait un moyen de cloner une connexion déjà valide –

+1

Vous avez vraiment besoin de poster plus de détails de votre "grand projet" pour obtenir de l'aide. Utilisez-vous Hibernate? Utilisez-vous le gestionnaire de transactions Spring? – Qianlong

+0

C'est la solution que j'ai adoptée à la fin, merci –

0

Il existe Ajax (JavaScript) dans le navigateur pour passer un appel, et avoir des rappels réussis/échoués reçus plus tard. Ce serait la façon la plus régulière.

Si plus est requis, enregistrez la demande de planification dans une file d'attente = enregistrez quelque chose dans la base de données. Ensuite, ayez une tâche de temporisateur (par exemple à partir du printemps) dans votre application qui fait le travail. Cela empêche la surcharge, DoS.

+0

je n'ai pas besoin de placer les requêtes dans une file d'attente. Si j'utilise Ajax et que l'utilisateur ferme son navigateur, le servlet sera-t-il encore exécuté jusqu'à la fin? –

+0

Oui traité jusqu'à la fin (sinon parfois indésirable). Je voulais dire par "file d'attente", que le traitement devrait prendre longtemps, en stockant simplement la tâche désirée avec ses paramètres pour plus tard, le traitement par minuterie serait mieux. –

0

En fait, si la réponse semble être entièrement envoyée au client lorsque vous fermez le flux de sortie de réponse (ou l'enregistreur), vous pouvez continuer le traitement dans la servlet sans aucun problème de thread. Malheureusement je ne pourrais jamais trouver une confirmation que si explicitement autorisé dans les spécifications de servlet, mais je pourrais le faire avec succès dans Tomcat (utilisait la version 7)

Donc, si vous le notez dans un commentaire en gras, votre code de servlet pourrait ressembler :

void service(ServletRequest req, ServletResponse resp) { 
    OutputStream out = res.getOutputStream(); 
    ... // generate the output 
    out.close();  // the response is sent to client 
    // asynchonous processing 
    ... 
} 
+0

Que faire si le client ferme le navigateur après avoir reçu une réponse? Le serveur note probablement que le socket a été fermé par le client et tue le processus, n'est-ce pas? –

+0

Je ne pense pas, parce que HTTP est un protocole déconnecté. –