私はこのクラスを持っています
@Service
@Profile("async")
public class MyServiceImplAsync implements MyService {
..
@Async
@Override
public void printGreetings(String name) {
//do something and sleep 10 seconds
}
@Async
@Override
public Future<String> doSomething(String text) {
//do something and sleep 25 seconds
return new AsyncResult<String>(text);
}
}
観察してください、2つの方法が使用します@Async
今、私も次のものを持っています:
@Component
public class MySchedule {
..
@Scheduled(cron="*/5 * * * * ?")
public void schedule(){
logger.info("Schedule working at {}", simpleDateFormat.format( new Date() ));
this.myService.printGreetings("Manolito");
}
@Scheduled(cron="*/30 * * * * ?")
public void scheduleFuture(){
logger.info("Schedule Future working at {}", simpleDateFormat.format( new Date() ));
try {
logger.info("{}", this.myService.doSomething("manolito").get(26, TimeUnit.SECONDS));
}
catch (InterruptedException | ExecutionException | TimeoutException e) {
logger.error("Error: {}, Class: {}", e.getMessage(), e.getClass());
}
}
}
メソッドはschedule()
5 秒ごとに実行するscheduleFuture()
必要があり、メソッドは 30 秒ごとに実行する必要があります。
次の状況で混乱しています。
schedule()
メソッドが 5 秒ごとに平和に動作していることがわかります。その後、scheduleFuture()
実行が開始されるとscheduleFuture()
、Future のgetメソッドによるメソッドがブロックされたままになります。これはFuture APIに従って予想される動作であるため、これで問題ありません。
私は考えました:
メソッドのみ
scheduleFuture()
をブロックする必要があります。
問題:なぜscheduleFuture()
他のメソッドもブロックするのか理解できませschedule()
ん! . つまり、ブロックされている場合scheduleFuture()
は、ブロックされたschedule()
ままです! . 新しいサイクルまたは実行を開始することはできません。scheduleFuture()
再びブロックが解除されるまで。
なぜこれが起こるのですか?
2 つの メソッドがあり、それぞれが Bean の注釈が付けられた2 つの異なる@Scheduled
メソッドを呼び出します (クラスが@Async
MyServiceImplAsync
@Scope("prototype")
前もって感謝します。