[我的设置:Java EE 6 应用程序,EJB3.1、CDI/Weld、JSF2 在 Glassfish 3.0.1 上运行]
我阅读了一些关于 EJB3.1 中新的@Asynchronous 方法的文章,但没有一篇文章提到异步方法的危险以及您真正需要关心的内容。
在我的应用程序中,我有一个@Asynchronous E-Mail 服务,发送大量邮件。我从 CDI/Weld Bean 调用此服务。在我的测试过程中,我经常遇到 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注入会不会更好?会有什么区别?
欢迎任何提示!