Spring @Async Beanメソッドが非同期で実行されないのはなぜですか?

マシューS

Springbootアプリケーションがあり、コントローラーメソッド内のBeanクラスで非同期メソッドを実行しようとしています。問題は、@ Asyncメソッドが非同期で実行されていないことです。メソッドが完了するまで実行は停止されます。

誰かが私が欠けているものを教えてもらえますか?

これが私のアプリケーションクラスです:

@SpringBootApplication
@EnableAsync
public class Application {

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

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
        factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {

            @Override
            public void customize(Connector connector) {

                connector.setPort(9000);
                connector.setAsyncTimeout(60000);
            }
        });
        return factory;
    }
 }

これが私のBeanクラスです:

public class LongProcess {

    @Async
    public Future<String> call() {
        try {
            System.out.println("Sleeping now...");
            Thread.sleep(10000);
            return new AsyncResult<String>("Hey");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

}

私の構成クラス:

@Configuration
@EnableAsync
public class LongProcessConfiguration implements AsyncConfigurer {

    @Bean
    public LongProcess longProcessBean() {
        return new LongProcess();
    }

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setThreadNamePrefix("LULExecutor-");
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new SimpleAsyncUncaughtExceptionHandler();
    }

}

私のコントローラーメソッド:

@RequestMapping("/utilities/longProcess")
    public String longProcess() {

        System.out.println("Starting long process...");
        CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();
        LongProcess process = context.longProcessBean();
        Future<String> result = process.call();
        System.out.println("Done!");
        return "{success: 1}";

    }

残念ながら、このリクエストはすぐには返されません(結果は気にしません)。メソッドは正常に呼び出されますが、バックグラウンドでは呼び出されません。私が欠けているかもしれない何か考えはありますか?

テストとして、結果を待機するようにコントローラーメソッドを変更した場合、待機ブロックは入力されません。

@RequestMapping("/utilities/longProcess")
    public String longProcess() throws InterruptedException {

        System.out.println("Starting long process...");
        CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();
        LongProcess process = context.longProcessBean();
        Future<String> result = process.call();
        while (!(result.isDone())) {
            Thread.sleep(1); //10-millisecond pause between each check
            System.out.println("Waiting for Long Process...");
        }
        System.out.println("Done!");
        return "{success: 1}";

    }
アルテムビラン

CDIの使用法に間違いがあります。Spring Containerを使用してオブジェクトを管理する場合は、ApplicationContextまたはのような機能を処理する必要があります@Autowired

コード

CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();

間違っている。

あなたはあなたをあなたLongProcessとして定義するので、@Beanあなたはそれをあなたに注入することができます@Controller

@Autowired
privete LongProcess process;

以前と同じように使用します。

オブジェクトを直接使用すると(たとえばnew)、dependency injection機能が失われます。

続きを読むSpringDocsをお願いします。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spring boot @Asyncメソッドは実際どのように非同期/非ブロッキングですか?

分類Dev

コントローラのSpring Boot @Asyncメソッドが同期的に実行されています

分類Dev

Spring Boot:非同期メソッドが別のスレッドで実行されていない

分類Dev

C#での非同期呼び出しが、それらが存在するメソッドがすでに 'async'キーワードで宣言されているのに、そのように宣言する必要があるのはなぜですか?

分類Dev

async / awaitがforEachループ内でioredisgetメソッドの実行を同期しないのはなぜですか?

分類Dev

awaitなしで呼び出されたasyncメソッドのawaitsはまだ非同期ですか?

分類Dev

Spring-Data-JPA Asyncが機能しないのはなぜですか?

分類Dev

属性のasync / awaitメソッドが返されないのはなぜですか

分類Dev

Mockitoを使用してSpring Bootで非同期(@Async)メソッドをモックする方法は?

分類Dev

asyncの接尾辞が付いたメソッドでasyncキーワードが使用されないことがあるのはなぜですか?

分類Dev

1つの@Asyncメソッドで使用されるスレッドプールが他の非同期メソッドの実行と共有されます

分類Dev

java-nica内のHystrix非同期メソッドがSpring-Boot Javaアプリケーション内で実行されない

分類Dev

Springの@Transactionalが保護されたメソッドで機能しないのはなぜですか?

分類Dev

Springの@Transactionalが保護されたメソッドで機能しないのはなぜですか?

分類Dev

Spring構成クラスの@Beanメソッドで@Autowiredが必要ないのはなぜですか?

分類Dev

@Asyncメソッドで結果を取り戻せないのはなぜですか?(「IllegalStateException:EntityManagerFactoryが閉じられました」がスローされます)

分類Dev

async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

分類Dev

async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

分類Dev

peeweeとpeewee-async:非同期が遅いのはなぜですか

分類Dev

Spring ReactiveMongoRepositoryにMonoのsaveメソッドがないのはなぜですか?

分類Dev

@Asyncメソッド内のSpring @ Asyncメソッド

分類Dev

Spring @ Asyncと完了可能なfuturerun async

分類Dev

async / await関数が2回実行されるのはなぜですか?

分類Dev

Spring BeanがTomcatサーブレットコンテナで実行できるのに、EJBでは実行できないのはなぜですか?

分類Dev

このコードがAsyncメソッドを使用しているのはなぜですか?

分類Dev

Beanがspring-servlet.xmlファイルからロードされないのはなぜですか?

分類Dev

Spring Rest Template Putメソッドが無効なのはなぜですか?

分類Dev

Springでメソッドレベルの検証が機能しないのはなぜですか?

分類Dev

Spring Boot WebアプリがGradleで完全に実行されないのはなぜですか?

Related 関連記事

  1. 1

    Spring boot @Asyncメソッドは実際どのように非同期/非ブロッキングですか?

  2. 2

    コントローラのSpring Boot @Asyncメソッドが同期的に実行されています

  3. 3

    Spring Boot:非同期メソッドが別のスレッドで実行されていない

  4. 4

    C#での非同期呼び出しが、それらが存在するメソッドがすでに 'async'キーワードで宣言されているのに、そのように宣言する必要があるのはなぜですか?

  5. 5

    async / awaitがforEachループ内でioredisgetメソッドの実行を同期しないのはなぜですか?

  6. 6

    awaitなしで呼び出されたasyncメソッドのawaitsはまだ非同期ですか?

  7. 7

    Spring-Data-JPA Asyncが機能しないのはなぜですか?

  8. 8

    属性のasync / awaitメソッドが返されないのはなぜですか

  9. 9

    Mockitoを使用してSpring Bootで非同期(@Async)メソッドをモックする方法は?

  10. 10

    asyncの接尾辞が付いたメソッドでasyncキーワードが使用されないことがあるのはなぜですか?

  11. 11

    1つの@Asyncメソッドで使用されるスレッドプールが他の非同期メソッドの実行と共有されます

  12. 12

    java-nica内のHystrix非同期メソッドがSpring-Boot Javaアプリケーション内で実行されない

  13. 13

    Springの@Transactionalが保護されたメソッドで機能しないのはなぜですか?

  14. 14

    Springの@Transactionalが保護されたメソッドで機能しないのはなぜですか?

  15. 15

    Spring構成クラスの@Beanメソッドで@Autowiredが必要ないのはなぜですか?

  16. 16

    @Asyncメソッドで結果を取り戻せないのはなぜですか?(「IllegalStateException:EntityManagerFactoryが閉じられました」がスローされます)

  17. 17

    async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

  18. 18

    async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

  19. 19

    peeweeとpeewee-async:非同期が遅いのはなぜですか

  20. 20

    Spring ReactiveMongoRepositoryにMonoのsaveメソッドがないのはなぜですか?

  21. 21

    @Asyncメソッド内のSpring @ Asyncメソッド

  22. 22

    Spring @ Asyncと完了可能なfuturerun async

  23. 23

    async / await関数が2回実行されるのはなぜですか?

  24. 24

    Spring BeanがTomcatサーブレットコンテナで実行できるのに、EJBでは実行できないのはなぜですか?

  25. 25

    このコードがAsyncメソッドを使用しているのはなぜですか?

  26. 26

    Beanがspring-servlet.xmlファイルからロードされないのはなぜですか?

  27. 27

    Spring Rest Template Putメソッドが無効なのはなぜですか?

  28. 28

    Springでメソッドレベルの検証が機能しないのはなぜですか?

  29. 29

    Spring Boot WebアプリがGradleで完全に実行されないのはなぜですか?

ホットタグ

アーカイブ