为什么主线程结束时异步请求被销毁?春季任务



我想写异步方法。

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

    }
}

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

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

对于这些异步任务的错误处理,您可以使用 Spring 集成中的ErrorHandlingTaskExecutor并为其提供ErrorHandler

相关内容

  • 没有找到相关文章

最新更新