4

私はこのクラスを持っています

@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メソッドを呼び出します (クラスが@AsyncMyServiceImplAsync@Scope("prototype")

前もって感謝します。

4

1 に答える 1