我想写异步方法。
@Component
public class TaskImpl implements Task{
@Async(value="myExecutor")
public void async(int n) throws InterruptedException{
log.info("Executing task"+n);
Thread.sleep(1000);
log.info("Finished executing task" +n);
}
}
很好!我有这样的配置:
<task:annotation-driven executor="myExecutor" />
<task:executor id="myExecutor" pool-size="3" />
太好了!我也写过测试课了!
@Autowired
private Task task;
@Test
public void mailSendTest() throws InterruptedException{
for (int i = 0; i <5; i++) {
task.async(i);
}
Thread.sleep(3000)
}
我已经测试过,异步效果非常好!任务并行!
问题1。 但是当测试用例的主线程破坏时,执行线程不起作用。换句话说,如果我不在测试用例中编写Thread.sleep(),Executor会立即击落。我该如何解决这个问题?
2015-03-12 17:02:26.706 INFO ThreadPoolTaskExecutor: Shutting down ExecutorService
我不想写JOIN或Sleep。
问题2。 我需要async()方法来调用邮件发件人类。换句话说,我已经写了这个组件。
@Component
public class MailMail {
private MailSender mailSender;
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
@Async
public void sendMail(String from, String to, String subject, String msg) {
....
}
}
}
现在我对如何解决以下问题感兴趣。可能存在通信,网络问题,我无法发送电子邮件。现在发生了什么?如何捕获异常并再次发送?
答案 0 :(得分:0)
对于测试用例,您可以Mockito.spy
TaskImpl
使用CountDownLetch
中的doAnswer()
并在测试方法结束时等待letch。
对于来自这些异步任务的错误处理,您可以使用Spring Integration中的ErrorHandlingTaskExecutor
并将其提供给ErrorHandler