0

Java 8 と Spring Boot 2.x はこちら。実行時間の長い操作を開始する RESTful リソースがあり、場合によっては完了するまでに 15 ~ 20 分かかる可能性があります。ここのサービスレイヤーでアノテーションを活用したいと思います@Asyncが、Spring Boot に精通した優れたエレガントなソリューションを受け入れます。

これまでの私の最善の試み:

@RestController
@RequestMapping(path = "/v1/fizzbuzzes")
public class FizzbuzzResource {

    @Autowired
    private FizzbuzzService fizzbuzzService;

    @Autowired
    private FizzbuzzRepository fizzbuzzRepository;

    @Autowired
    @Qualifier("fizzbuzz.ids")
    private List<String> fizzbuzzList;

    @PostMapping("/{fizzbuzzId}")
    public ResponseEntity<Void> runFizzbuzzOperations(@PathVariable String fizzbuzzId)
            throws ExecutionException, InterruptedException {

        ResponseEntity responseEntity;

        // verify the fizzbuzzId is valid -- if it is, we process it
        Optional<Fizzbuzz> fbOpt = fizzbuzzRepository.lookupMorph(fizzbuzzId);
        if (fbOpt.isPresent()) {

            fizzbuzzList.add(fizzbuzzId);

            CompletableFuture<Void> future = fizzbuzzService.runAsync(fbOpt.get());
            future.get();
            // TODO: need help here

            // TODO: decrement the list once the async has completed -- ONLY do once async has finished
            fizzbuzzList.remove(fizzbuzzId);

            // return success immediately (dont wait for the async processing)
            responseEntity = ResponseEntity.ok().build();

        } else {
            responseEntity = ResponseEntity.notFound().build();
        }

        return responseEntity;

    }

}

@Service
public class FizzbuzzService {

    @Async
    public CompletableFuture<Void> runAsync(Fizzbuzz fizzbuzz) {

        // do something that can take 15 - 20 mins to complete
        // it actually is writing a massive amount of data to the file system
        // so there's nothing to really "return" so we just return null (?)

        return CompletableFuture.completedFuture(null);

    }

}

私は近いと思いますが、苦労しています:

  • 実際に非同期で実行されるように適切に呼び出す方法と、それ以外の場合のように 15 分ほど待つのではなく、その下にあるものをすぐに実行する方法。とfizzbuzzService.runAsync(...)ResponseEntity.ok().build()
  • fizzbuzzList.remove(...)非同期サービス メソッドが完了するとすぐに実行する方法 (これも 15 ~ 20 分後)。と
  • おそらく、非同期操作で何らかのタイプのタイムアウトを構成し、たとえば30分後に例外で失敗します

誰かが私が間違っているところを見つけることができますか?

4

1 に答える 1