Package org.jetbrains.annotations

## Annotation Type NonBlockingExecutor

-     @Documented
      @Retention(CLASS)
      @Target({TYPE,TYPE_USE})
      public @interface NonBlockingExecutor

  Indicates that the annotated executor (CoroutineContext, Scheduler) does not allow blocking methods execution.

  If a given executor allows blocking calls, `BlockingExecutor` should be used.

  Example 1 (Kotlin coroutines):

        class NonBlockingExampleService {
            val dispatcher: @NonBlockingExecutor CoroutineContext
                get() { ... }

            suspend fun foo() {
                val result = withContext(dispatcher) {
                    blockingBuzz() // IDE warning: `Possibly blocking call in non-blocking context`
                }
            }

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

  Example 2 (Java with Reactor framework):

        class NonBlockingExampleService {
            private static final @NonBlockingExecutor Scheduler operationsScheduler =
                    Schedulers.newParallel("parallel");

            public Flux<String> foo(Flux<String> urls) {
                return urls.publishOn(operationsScheduler)
                        .filter(url -> blockingBuzz(url) != null);  // IDE warning: `Possibly blocking call in non-blocking context`
            }

            @Blocking
            private String blockingBuzz(String url) { ... }
        }

  See Also:
    `Blocking`, `NonBlocking`