[내 설정 : 자바 EE 6 응용 프로그램, EJB3.1과는 CDI/용접, JSF2은 글래스 피시 3.0.1에서 실행] EJB3.1 @Asynchronous를 사용하는 경우에서 ConcurrentModificationExceptions을 방지하는 방법
는 난에 대한 몇 가지 기사를 읽고 EJB3.1의 새로운 @Asynchronous 메소드들 중 어느 것도 비동기 메소드의 위험성과 당신이 정말로 신경 써야 할 것들을 언급하지 않았다.내 앱에서 많은 양의 메일을 보내는 @Asynchronous 전자 메일 서비스가 있습니다. CDI/Weld Bean에서이 서비스를 호출합니다. 테스트 도중, 나는 종종 ConcurrentModificationExceptions를 경험했지만, 지금까지는 때로는 충돌하는 곳과 이유를 이해하지 못했습니다.
그냥 내 콩 대략 중요한 부분, 같이 방법을 보여줍니다 : 내 CDI-콩에서@Stateful @LocalBean
public class EmailEJB {
//... Injections
@Asynchronous
public Future<Integer> sendEmails(User user, Message message) {
// ... send mails
return new AsyncResult<Integer>(1);
}
}
을, 나는이 같은이 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);
(...)
}
}
나는 단지 일반적으로 다음과 같이 묻고 싶다. 내가 여기서 완전히 잘못된 것을하고 있는가? (스코프, 주사, 미래 사용)? ConcurrentModificationExceptions를 피하기 위해 @Asynchronous 메서드를 사용할 때 무엇을 신경 써야합니까?
나는 이메일을 EJB로 주입하고있다. EmailEJB 전체를 비동기로 만들고 @Inject @Asynchronous로 주입하는 것이 더 좋을까요? 차이점은 무엇입니까?
어떤 힌트를 환영합니다!