async メソッドを書きたかったのです。
@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) {
....
}
}
}
今、私は次の問題を解決する方法に興味があります。通信、ネットワークに問題があり、メールを送信できない可能性があります。今、何が起きた?例外をキャッチして再度送信する方法は?