제목은 기본적으로 현재 내 문제를 요약합니다. Job의 여러 인스턴스가 동시에 실행되는 경우 Javamail은 동 기적으로 사용되기 때문에 예외가 발생합니다. 비동기 적으로 실행할 수있는 방법이 있습니까? 또는 비동기 Javamail에 대한 대안이 있습니까?Javamail을 사용하여 전자 메일을 보내 겠지만 Javamail은 동기식입니다.
0
A
답변
1
나는 작업 같은 종류의 처리하는 방법에는 여러 가지가 생각 :
- 는 주기적으로 이메일의 배치를 전송하는 서비스로 마무리가;
은 각각의 이메일을 온 글쓰기로 보냅니다. 즉, 별도의 SMTP 연결을 의미합니다.
@Async public void sendEmail(String smtpServer, String to,String from,String subject, String body) { send(smtpServer, to, from, subject, body); }
2
나는 석영과 항상 이런 종류의 물건을한다. 다른 스레드를 스핀 오프하면됩니다. 당신이하는 일은 환경에 따라 크게 달라집니다. App 서버에서 실행 중이거나 단순히 바닐라 Java를 실행 중입니까?
나중에 스레드를 스핀 - 오프하면 많은 튜토리얼이 있습니다.
Wildfly와 같은 응용 프로그램 서버에서 실행중인 경우 세션 빈에서 @Asynchronous 태그를 사용하십시오. 유일한 까다로운 점은 Quartz 스케쥴 된 작업으로 CDI 할 수 없다는 것이다. JNDI를 사용하여 원하는 세션 빈에 대한 컨테이너 프록시를 가져와야한다. 이런 식으로 뭔가 :
@NoArgsConstructor
@ApplicationScoped
@Slf4j
public class YourJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException
{
String message = "";
try {
final InitialContext ctx = new InitialContext();
final IYourSessionBean yoruSessionBean = (IYourSessionBean) ctx.lookup("java:global/server-core/YourSessionBean!com.somecompany.interfaces.IYourSessionBean");
final JobKey key = context.getJobDetail().getKey();
final JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String taskID = dataMap.getString(BjondQuartzService.TASKID);
String descr = dataMap.getString(BjondQuartzService.DESCRIPTION);
yourSessionBean.assignTaskAsync(taskID, descr);
context.setResult("SUCCESS");
} catch(Exception e) {
log.error("Could not assign task: {}", message, e);
context.setResult("FAILURE");
}
}
}
그리고 수신 측에 :
@Asynchronous
@TransactionAttribute(REQUIRED)
@Override
public void assignTaskAsync(@NotNull(message="taskID must not be null")
final String taskID,
@NotNull(message="descr must not be null")
final String descr
) throws Exception {
Do some stuff here.
}
참고 @Asychronous 태그입니다. 각 컨테이너에는 풀에서 추출 할 수 있고 스레드와 같은 비동기 호출에 사용할 수있는 여러 스레드가 있습니다. 나는 Runnable을 직접 다루는 것보다 이것을 쉽게 발견한다.
나는 이러한 해결책을 고맙게 생각합니다. – Edmond