1

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

        ....
    }


    }
}

今、私は次の問題を解決する方法に興味があります。通信、ネットワークに問題があり、メールを送信できない可能性があります。今、何が起きた?例外をキャッチして再度送信する方法は?

4

1 に答える 1