web-dev-qa-db-ja.com

@EnableAsyncアノテーションはどこに置くべきですか

データをDBに保存しながら、非同期でメールを送信する必要があります。

私のアプローチはこのようなものでした。

//I have tried with service layer annotating.But not worked. 
@EnableAsync 
class MyService{
 public String saveMethod(List listOfData){
    mail.sendEmailQuote(listOfData);
    mail.sendEmailWorkflowTaskAssignment(listOfData);
    myDao.saveData(listOfData);
 }
}

以下のメソッドを@Asyncで実行する必要があります。 @EnableAsyncアノテーションはどこに配置すればよいですか。これはスケジュール関連のものではありません。これは、ユーザーが保存ボタンをクリックしたときに発生します。用途はフレックススプリングブレイズDSを使用。私が書いたコントローラはありません。

私のコードでは、次の2つの方法で@Asyncアノテーションを使用しています。それらはクラスMailにあります。

@Async
sendEmailQuote(listOfData){}

@Async
sendEmailWorkflowTaskAssignment(listOfData){}

@EnableAsyncをどこに置くべきかを見つけるのを手伝ってくれませんか?

このサンプルを参照

8
Sanka

EnableAsyncは構成に使用され、Springの非同期メソッド実行機能を有効にします。ServiceまたはComponentクラスに配置しないでください。Configurationクラスのような:

@Configuration
@EnableAsync
public class AppConfig {

}

または、次のようにAsyncExecutorをさらに構成します。

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

 @Override
 public Executor getAsyncExecutor() {
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
     executor.setCorePoolSize(7);
     executor.setMaxPoolSize(42);
     executor.setQueueCapacity(11);
     executor.setThreadNamePrefix("MyExecutor-");
     executor.initialize();
     return executor;
 }
 }

詳細は it's Java doc を参照してください。

そして、あなたが従ったチュートリアルでは、EnableAsyncApplicationクラスの上に置かれ、AsyncExecutor構成でextends AsyncConfigurerSupportになります。

@SpringBootApplication
@EnableAsync
public class Application extends AsyncConfigurerSupport {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@Override
public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(2);
    executor.setQueueCapacity(500);
    executor.setThreadNamePrefix("GithubLookup-");
    executor.initialize();
    return executor;
}
}
10
shizhz

@Asyncメソッドが同じクラスによって呼び出されないことを確認してください。プロキシの自己呼び出しは機能しません。

9
watts