Springブート1.5.4でjhipsterを使用すると、バックグラウンドタスクを非同期で実行するのに苦労しています。彼らは私が設定したものとは異なるtaskExecutorとスレッドプールを使って同期的に実行されているように見えます。Java Spring Async Execution
@Service
@Transactional
public class AppService {
@Scheduled(fixedDelay = 3000)
public void consumeData() {
// connect to a subscriber and push data to the workerBee
for(Tuple data : this.getTuples()) {
workerBee(data);
}
}
@Timed
@Async
public void workerBee(Tuple data) throws Exception {
// ... do something that takes 300ms ....
Thread.sleep(300);
}
}
は間違いなくサービスは、この作業に最適な場所ではなく、デモの目的のために、それがフィット:
このすべてがbevityのために、そのように定義されたサービスで起こります。
(また余談として、それは@Timedが動作していないapearsが、サービス内で内部的に呼び出されたとき、私は@Timedが動作しないことをどこかで読ん)application.yml
の
関連セクション:
jhipster:
async:
core-pool-size: 8
max-pool-size: 64
queue-capacity: 10000
私はのTaskExecutor Beanが作成取得していることを確認し
@Override
@Bean(name = "taskExecutor")
public Executor getAsyncExecutor() {
log.debug("Creating Async Task Executor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(jHipsterProperties.getAsync().getCorePoolSize());
executor.setMaxPoolSize(jHipsterProperties.getAsync().getMaxPoolSize());
executor.setQueueCapacity(jHipsterProperties.getAsync().getQueueCapacity());
executor.setThreadNamePrefix("app-Executor-");
return new ExceptionHandlingAsyncTaskExecutor(executor);
}
と:デフォルトを使用して は
、このようになりますAsyncConfiguration.javaを、生成されましたliquibaseによって使用されています。
私がvisualvmに接続すると、何らかの種類のデフォルトでなければならないすべての作業がpool-2-thread-1
で起きていることがわかります。作業は同期的に起きていて、非同期ではないことは明らかです。
物事は私が試してみた:
- は、コアプールサイズで8つのスレッドでのTaskExecutorの構成を確認@Async注釈などの
@Async("taskExecutor")
- にexecutorを指定します。
- アプリケーションに@EnableAsyncアノテーションがあることを確認します(デフォルトではこれが行われます)。
。それがなぜ助けられるのでしょうか? –
答えを無視するあなたはジプスターを使用しているとわかります –