Annotation Interface BlockingExecutor


@Documented @Retention(CLASS) @Target({TYPE,TYPE_USE}) public @interface BlockingExecutor
Indicates that the annotated executor (CoroutineContext, Scheduler) allows blocking methods execution.

If a given executor does not allow blocking calls, NonBlockingExecutor should be used.

Example 1 (Kotlin coroutines):

 class BlockingExampleService {
     val dispatcher: @BlockingExecutor CoroutineContext
         get() { ... }

     suspend fun foo() {
         val result = withContext(dispatcher) {
             blockingBuzz() // no IDE warning
         }
     }

     @Blocking fun blockingBuzz() { ... }
 }

Example 2 (Java with Reactor framework):

class BlockingExampleService {
    private static final @BlockingExecutor Scheduler blockingScheduler =
            Schedulers.newBoundedElastic(4, 10, "executor");

    public Flux<String> foo(Flux<String> urls) {
        return urls.publishOn(blockingScheduler)
                .map(url -> blockingBuzz(url));  // no IDE warning
    }

    @Blocking
    private String blockingBuzz(String url) { ... }
}
See Also: