🕐 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:
- esecuzione "default" di un
Mono(senza specificare uno scheduler) - esecuzione di un
Monocon l'uso esplicito dello schedulerSchedulers.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! ☕