为什么主线程结束时会破坏异步请求?春天的任务

时间:2015-03-12 13:13:47

标签: multithreading spring asynchronous spring-integration spring-io

我想写异步方法。

@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)   {

        ....
    }


    }
}

现在我对如何解决以下问题感兴趣。可能存在通信,网络问题,我无法发送电子邮件。现在发生了什么?如何捕获异常并再次发送?

1 个答案:

答案 0 :(得分:0)

对于测试用例,您可以Mockito.spy TaskImpl使用CountDownLetch中的doAnswer()并在测试方法结束时等待letch。

对于来自这些异步任务的错误处理,您可以使用Spring Integration中的ErrorHandlingTaskExecutor并将其提供给ErrorHandler