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]
コメントを追加