πŸ• Tempo di lettura: 2 minuti

Qualche giorno fa mi sono imbattuto nel metodo boundedElastic(). L'ho esplorato un po' e ne Γ¨ nata una pillolina – era da un po' che non ne scrivevo una!

πŸ“Œ L'esperimento

Il codice qui sotto si propone di verificare il comportamento del thread in due casi distinti:

  1. esecuzione "default" di un Mono (senza specificare uno scheduler)
  2. esecuzione di un Mono con l'uso esplicito dello scheduler Schedulers.boundedElastic()
@Slf4j
@SuppressWarnings("squid:S3577")
class SampleTest013 {

    private static final Consumer<String> logThreadName = threadName -> log.info("threadName: {}", threadName);

    @Test
    void test_defaultMonoExecutionRunsOnMainThread() {
        final String threadName = Mono.fromCallable(() -> Thread.currentThread().getName())
                .doOnNext(logThreadName)
                .block();
        assertEquals("main", threadName);
    }

    @Test
    void test_monoExecutionRunsOnBoundedElasticThread_whenUsingSubscribeOn() {
        final String threadName = Mono.fromCallable(() -> Thread.currentThread().getName())
                .doOnNext(logThreadName)
                .subscribeOn(Schedulers.boundedElastic())
                .block();
        assertNotNull(threadName);
        assertTrue(threadName.startsWith("boundedElastic-"));
    }
}

πŸ“‘ Analisi del 1Β° test – defaultMonoExecutionRunsOnMainThread()

Viene creato un Mono che restituisce il nome del thread corrente. PoichΓ© non viene specificato alcuno scheduler, il codice viene eseguito sul thread chiamante, che in un test JUnit Γ¨ il thread main. CiΓ² dimostra che, per impostazione predefinita, un Mono viene eseguito nello stesso thread che lo sottoscrive, se non si specifica uno scheduler.

πŸ“‘ Analisi del 2Β° test – monoExecutionRunsOnBoundedElasticThread()

Il Mono Γ¨ identico, ma viene aggiunto .subscribeOn(Schedulers.boundedElastic()). Questo modifica il comportamento: l'esecuzione viene spostata su uno dei thread del pool boundedElastic, grazie a subscribeOn(...). Si tratta di uno scheduler adatto a operazioni bloccanti o lente, come l'accesso a file o database. L'utilizzo di subscribeOn(...) cambia il thread su cui il Mono viene eseguito, permettendo di disaccoppiare la logica dal thread corrente!

Alla prossima pillola! β˜•