[我的設置:Java EE 6的應用,與EJB3.1,CDI /焊縫,JSF2 Glassfish上運行3.0.1]如何使用EJB3.1 @Asynchronous時避免ConcurrentModificationExceptions
我讀了一些文章EJB3.1中的新的@Asynchronous方法,但沒有一個提到了異步方法的危害以及你真正必須關心的問題。
在我的應用程序中,我有@Asynchronous電子郵件服務,發送大量郵件。我從CDI/Weld Bean調用這個服務。在我的測試過程中,我經常遇到ConcurrentModificationExceptions,但直到現在,我並不真正瞭解它有時會崩潰的位置和原因。
爲了表明我有多麼豆類大致模樣,最重要的部分:
@Stateful @LocalBean
public class EmailEJB {
//... Injections
@Asynchronous
public Future<Integer> sendEmails(User user, Message message) {
// ... send mails
return new AsyncResult<Integer>(1);
}
}
在我CDI豆,我使用這個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);
(...)
}
}
我只是想問一般情況:我在這裏做的事情是否完全錯誤(範圍,注射,使用未來)?使用@Asynchronous方法時,我必須關心什麼,以避免ConcurrentModificationExceptions?
我正在將Email作爲EJB注入。將整個EmailEJB異步並注入@Inject @Asynchronous會更好嗎?有什麼區別?
任何提示歡迎!