Führen Sie hintergrund-Prozess in verschiedenen Threads in Java
Schreibe ich eine Anwendung, wo Benutzer können hinzufügen und entfernen, die andere Benutzer als Freunde.
Meine Seite hat eine Liste der verschiedenen Benutzer und jeder Benutzer hat mit einer Schaltfläche hinzufügen in die Freundesliste.
Ich sende eine AJAX Anfrage an Java-servlet, um die gewählten Benutzer als Freund.
Ich zeige Warnung bei UI um zu zeigen das Ergebnis des Prozesses.
Mein problem ist ich habe ne mail geschickt, wenn der Benutzer wird Hinzugefügt als Freund dieser code ist geschrieben in der gleichen Methode im servlet.
Weil dieses Stück code meiner alert-Meldung kommt sehr spät.
Muss ich laufen, eine separate pthread ausführen "mail senden" - Funktion, so dass, wenn Benutzer Hinzugefügt wird, werde ich das Ergebnis erhalten und die mail wird in separater Prozess.
Meinen code in das Servlet ist
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.";
}
}
InformationsquelleAutor viredra-agarwal | 2010-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, ob dies das problem ist. Senden Sie eine E-Mail ist nicht ganz so teure operation - es informiert den SMTP-server, der die mail gesendet werden soll, und der SMTP-server kümmert sich von dort aus auf.
Immer noch, Sie könnten versuchen:
InformationsquelleAutor Bozho
Ich würde vorschlagen, die Definition einer
ExecutorService
in Ihrem servlet-und dann senden Sie eineRunnable
oderCallable
zum Dienst, um die Arbeit der Versendung der E-Mail.Vorteile dieses Ansatzes beinhalten:
Thread
jeder Zeit.ThreadPoolExecutor
und überschreibenafterExecute(Runnable, Throwable)
oder durch die Definition einesCompletionService
zu inspizieren, um die Ergebnisse jeder abgeschlossenenRunnable
.InformationsquelleAutor Adamski
Recht einfach in java 5 oder höher:
ps. möglicherweise müssen Sie einige Variablen final, damit es verwendbar ist innerhalb der Thread, aber ich ll verlassen, die als übung für den Leser 🙂
InformationsquelleAutor Chii
Einer anderen option zu tun, Ihre Aufgabe(senden von E-Mail im hintergrund) wird ein anderes kleines Programm(vielleicht ein daemon), die in regelmäßigen Abständen Lesen Sie die spezielle Tabelle in der DB und E-Mail senden. Programm geschrieben in jeder Sprache und ab OS hintergrund verarbeiten.
Hier ist der Vorteile tun, Weg:
InformationsquelleAutor ponkin
Lesen Sie die Dokumentation zu
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html
Sollten Sie eine Unterklasse von java.lang.Thread der Umsetzung Ihrer run-Methode. Es wird wahrscheinlich wie Ihre aktuelle sendMail.
Dann rufen Sie die Methode start auf den thread, und die Steuerung kehrt sofort in die nächste Zeile von code während der thread ausgeführt wird, in den hintergrund.
InformationsquelleAutor silviot