π 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! β