[Моя установка: приложение Java EE 6 с EJB3.1, CDI/Weld, JSF2, работающим на Glassfish 3.0.1]
Я читал несколько статей о новых @Asynchronous методах в EJB3.1, но ни в одной из них не упоминались опасности асинхронных методов и то, о чем вам действительно нужно заботиться.
В моем приложении у меня есть служба @Asynchronous E-Mail, отправляющая много писем. Я вызываю эту службу из компонента CDI/Weld. Во время моих тестов я часто сталкивался с ConcurrentModificationExceptions, но до сих пор я не очень понимаю, где и почему он иногда падает.
Просто чтобы показать, как примерно выглядят мои Beans, важные части:
@Stateful @LocalBean
public class EmailEJB {
//... Injections
@Asynchronous
public Future<Integer> sendEmails(User user, Message message) {
// ... send mails
return new AsyncResult<Integer>(1);
}
}
В моем CDI-Bean я использую этот EJB следующим образом (открывая прогресс для JSF2):
@Named @SessionScoped
public class MessageManager {
@EJB
public EmailEJB emailEJB;
public FutureEJB<Integer> progress;
public Integer getProgress() {
if (progress == null) return 0;
else {
return progress.get();
}
}
public String sendMessage() {
(...)
progress = emailEJB.sendEmails(user, message);
(...)
}
}
Я просто хотел спросить в общем: я делаю что-то совершенно не так (прицелы, инъекции, использование Future)? О чем мне нужно заботиться при использовании методов @Asynchronous, чтобы избежать ConcurrentModificationExceptions?
Я ввожу электронную почту как EJB. Будет ли лучше сделать весь EmailEJB асинхронным и внедрить его с помощью @Inject @Asynchronous? Какая разница?
Любые подсказки приветствуются!