Exécuter le processus d'arrière-plan dans un thread différent en Java
Je suis en train d'écrire une application où l'utilisateur peut ajouter et supprimer d'autres utilisateurs comme des amis.
Ma page a une liste de diffrent utilisateurs et est attribué à chaque utilisateur avec un bouton pour les ajouter dans votre liste d'amis.
Je suis de l'envoi d'une requête AJAX Java servlet pour ajouter l'utilisateur sélectionné comme un ami.
Je suis en train de montrer message d'alerte à l'INTERFACE utilisateur pour afficher le résultat de processus.
Mon problème est que j'ai envoyé un mail lorsqu'un utilisateur est ajouté comme ami ce code est écrit dans la même méthode dans la servlet.
À cause de ce bout de code de mon message d'alerte arrive très tard.
J'ai besoin d'exécuter un distinct pthread pour exécuter cette fonction mail de sorte que lorsque l'utilisateur est ajouté-je obtenir le résultat et le mail sera envoyer dans un processus séparé.
Mon code de la Servlet est
private void sendMail(long inviteeID) {
User inviteeUser = null;
try {
inviteeUser = userHandler.getUser(inviteeID);
} catch (DataException e) {
sLog.error("User does not exist.", e);
} catch (UserNotFoundException e) {
sLog.error("User does not exist.", e);
}
MailUtility.send(inviteeUser.getUserEmailAddress().trim(),
"[email protected]", "add friend message", Utility
.getAddFriendMessageBody(LoginHelper
.getLoggedInUserEmail()), false);
}
private String inviteAsFriend(long inviteeID) {
boolean result = false;
if (LoginHelper.isUserLoggedIn()) {
try {
User user = userHandler.findUserByEmail(LoginHelper
.getLoggedInUserEmail());
if (userHandler.isUserFriend(user.getUserId(), inviteeID)) {
if (userHandler.addFriend(user, inviteeID)) {
result = true;
return "Member added successfully as your friend.";
} else {
return "Member could not be added as your friend. Please try again later.";
}
} else {
return "Member is already your friend.";
}
} catch (DataException e) {
return "User does not exist.";
} catch (UserNotFoundException e) {
return "User does not exist.";
} catch (Exception e) {
return "Member could not be added as your friend. Please try again later.";
} finally {
if (result) {
sendMail(inviteeID);
}
}
} else {
return "User not logged in.";
}
}
source d'informationauteur viredra-agarwal | 2010-01-20
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr que ce soit le problème. L'envoi d'un email n'est pas tout à fait cette opération coûteuse - il en informe le serveur SMTP que le courrier doit être envoyé, et le SMTP server prend en charge à partir de là.
Encore, vous pourriez essayer:
Je vous suggère de définir une
ExecutorService
au sein de votre servlet et de faire ensuite uneRunnable
ouCallable
au service afin d'effectuer le travail de l'envoi de l'email.Avantages de cette approche sont:
Thread
à chaque fois.ThreadPoolExecutor
et dominanteafterExecute(Runnable, Throwable)
ou par la définition d'unCompletionService
pour inspecter les résultats de chaqueRunnable
.assez simple en java 5 ou au-dessus:
ps. vous devrez peut-être faire quelques variables final dans l'ordre pour qu'il soit utilisable à l'intérieur de l'exécutable, mais je ll laisser cela comme un exercice pour le lecteur 🙂
Une autre option pour faire votre tâche(pour l'envoi de mail en arrière-plan) est d'avoir un autre petit programme(peut-être un démon) qui sera périodiquement lire la Table dans la DB et envoyer des courriels. Le programme peut être écrit dans n'importe quelle langue et, à partir de l'OS de fond proccess.
Voici les avantages de faire de cette façon:
Lisez la documentation sur
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html
Vous devez sous-classe java.lang.Fil de la réalisation de votre méthode de course. Il sera probablement comme votre sendMail.
Vous pouvez ensuite appeler la méthode start sur le fil, et le contrôle retourne immédiatement à la ligne de code suivante tandis que le thread est exécuté en arrière-plan.