J'écris une application où l'utilisateur peut ajouter et supprimer d'autres utilisateurs en tant qu'amis. Ma page a une liste de différents utilisateurs et chaque utilisateur est donné avec un bouton pour les ajouter dans une liste d'amis. J'envoie une demande Ajax à Java Servlet pour ajouter l'utilisateur sélectionné en tant qu'ami. Je montrent un message d'alerte à l'interface utilisateur pour montrer le résultat d'un processus.
Mon problème est que je dois envoyer un courrier lorsque l'utilisateur est ajouté à l'amiable. Ce code est écrit dans la même méthode dans le servlet. P>
En raison de cette pièce de code, mon message d'alerte est très tard. P>
Je dois exécuter une pthead séparée pour exécuter cette fonction d'envoi de messagerie afin qu'une fois ajouté à l'utilisateur, je obtiendra le résultat et le courrier sera envoyé. Dans un processus séparé. p>
Mon code dans le servlet est P>
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(), "vagarwal@q3tech.com", "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."; } }
5 Réponses :
Lire la documentation à p>
http: //java.sun .Com / J2SE / 1.5.0 / DOCS / API / JAVA / LANG / FILTH.HTML P>
Vous devez sous-classer java.lang.thread implémenter votre méthode d'exécution. Ce sera probablement comme votre sendmail actuel. Ensuite, vous appelez la méthode Démarrer sur le thread et contrôlez-vous immédiatement à la ligne de code suivante lorsque le thread est exécuté en arrière-plan. P>
Une manière préférée serait de définir une classe qui implémente courante puis de construire un fil passant dans l'instance runnable. Le thread de sous-classement est une forme d'héritage de mise en œuvre et n'est généralement pas recommandé.
Je ne suis pas sûr que ce soit le problème. L'envoi d'un courrier électronique n'est pas tout à fait une opération coûteuse - il informe simplement le serveur SMTP que le courrier doit être envoyé et que le serveur SMTP prend soin de là sur.
toujours, vous pouvez essayer: P>
new Thread(new Runnable() { public void run() { MailUtility.send(inviteeUser.getUserEmailAddress().trim(), "vagarwal@q3tech.com", "add friend message", Utility .getAddFriendMessageBody(LoginHelper .getLoggedInUserEmail()), false); } }).start();
Pour moi envoyer un email est une opération coûteuse
Je suggérerais de définir un exécuteur code> dans votre servlet puis soumettre un
exécutable code> ou
appelable code> au service afin d'effectuer le travail. d'envoyer l'email.
private ExecutorService execService = Executors.newFixedThreadPool(1);
...
execService.submit(new Runnable()) {
public void run() {
// Send email.
}
};
threadpoolexecutor code> et de remplacement
après -execute (exécutable, jetable) code> ou en définissant un
complottionnelservice code> pour inspecter la Résultats de chaque
Runnable code>. LI>
Assez simple en Java 5 ou plus:
private final ExecutorService executor = Executors.newFixedThreadPool(MAX_ALLOWED_THREADS); 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); } executor.submit(new Runnable() { public void run() { MailUtility.send(inviteeUser.getUserEmailAddress().trim(), "vagarwal@q3tech.com", "add friend message", Utility .getAddFriendMessageBody(LoginHelper .getLoggedInUserEmail()), false); } }); }
Une autre option pour faire votre tâche (pour envoyer un courrier électronique à l'arrière-plan) consiste à avoir un autre petit programme (peut être un démon) qui lira périodiquement la table spéciale dans dB et envoyer un courrier électronique. Le programme peut être écrit dans n'importe quelle langue et commencer dans la procédure d'arrière-plan du système d'exploitation. P>
Voici les avantages de faire de cette façon: p>