[我的设置: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会更好吗?有什么区别?
任何提示欢迎!