9
votes

Exécuter le processus de fond dans un fil différent en Java

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.";
    }
}


0 commentaires

5 Réponses :


0
votes

Lire la documentation à

http: //java.sun .Com / J2SE / 1.5.0 / DOCS / API / JAVA / LANG / FILTH.HTML

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.


1 commentaires

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é.



14
votes

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();


1 commentaires

Pour moi envoyer un email est une opération coûteuse



11
votes

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.
  }
};
  • Vous n'effectuez pas l'opération coûteuse de la création d'un nouveau fichier code> code> à chaque fois. li>
  • Vous conservez un plus grand contrôle sur le total #Threads exécutant dans votre servlet (comme les demandes de courrier électronique sont simplement en file d'attente). LI>
  • la manipulation des erreurs peut être centralisée, soit en sous-classement 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>
  • Votre fil d'appel est transmis un avenir, qui peut potentiellement être utilisé pour marraler les résultats ou bloquer jusqu'à ce que le calcul asynchrone soit terminé. Li> ul> p>


0 commentaires

5
votes

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);
         }
    });
}


0 commentaires

1
votes

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.

Voici les avantages de faire de cette façon:

  1. Vous pouvez utiliser Hwatever que vous aimez écrire un tel démon.
  2. Vous pouvez contrôler le bien de ce démon: détecter lorsque deux personnes essayant de s'ajoindre mutuellement à des amis.
  3. Perfomance - Envoi d'e-mails peut abuser du serveur (en particulier l'interface réseau). Avoir un tel démon, vous pouvez l'installer sur le serveur Defferent avec une interface réseau différente.
  4. ....

0 commentaires