Я пишу приложение, где пользователь может добавить и удалить других пользователей как друзей. Моя страница имеет список различных пользователей, и каждому пользователю дают с кнопкой для добавления их в списке друзей. Я отправляю запрос Ajax к сервлету Java для добавления выбранного пользователя как друга. Я показываю аварийное сообщение в UI для показа результата процесса.
Моя проблема, у меня есть к отправленному почта, когда пользователь добавляется как друг, этот код написан в том же методе в сервлете.
Из-за этой части кода мое аварийное сообщение появляется очень поздно.
Я должен выполнить отдельный pthread для выполнения, это отправляет почтовую функцию так, чтобы, после того как пользователь был добавлен, я получу результат, и почта будет, отправляют в отдельном процессе.
Мой код в Сервлете
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.";
}
}
Я не уверен, что это проблема. Отправка электронной почты - это не совсем такая дорогостоящая операция - это просто информирует SMTP-сервер о том, что почта должна быть отправлена, а SMTP-сервер заботится от него.
Тем не менее, вы можете попробовать:
new Thread(new Runnable() {
public void run() {
MailUtility.send(inviteeUser.getUserEmailAddress().trim(),
"vagarwal@q3tech.com", "add friend message", Utility
.getAddFriendMessageBody(LoginHelper
.getLoggedInUserEmail()), false);
}
}).start();
Я бы предложил определить ExecutorService
в вашем сервлете в вашем сервлете, а затем представить Runnable
или Callable
к услуге, чтобы выполнить работу по отправке Эл. адрес.
private ExecutorService execService = Executors.newFixedThreadPool(1);
...
execService.submit(new Runnable()) {
public void run() {
// Send email.
}
};
Преимущества этого подхода включают в себя:
поток
каждый раз. ThreadPoolexecuteCuturexecutor
и переопределение Afterexecute (Runnable, Remable)
или путем определения завершения поставки
для проверки результатов каждого Завершено Runnable
. Довольно прост в Java 5 или выше:
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);
}
});
}
PS. Возможно, вам понадобится сделать финал переменных для того, чтобы он был использован в родительском языке, но я оставлю это как упражнение для читателя :)
Другой вариант для выполнения вашей задачи (для отправки электронной почты в фоновом режиме) - иметь другую небольшую программу (может быть демоном), которая будет периодически читать специальную таблицу в DB и отправить электронную почту. Программа может быть написана на любом языке и начать на фоне ОС Proccess.
Вот преимущества этого способа:
Прочитайте документацию в
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/doCs/api/java/lang/thrad.html
, вы должны подкласс java.lang.thread реализует ваш метод запуска. Это, вероятно, будет похоже на ваш нынешний sendmail. Затем вы называете метод начала на потоке, а немедленно возвращается управление к следующей строке кода, пока нить выполняется в фоновом режиме.