Spring Boot - Multi thread

di il
2 risposte

Spring Boot - Multi thread

Ciao a tutti,
vorrei confrontarmi con chi ne ha voglia sul seguente requisito ed eventuali proposte di soluzione:

Il requisito è il seguente:
è necessario gestire l'operatività di una campagna di sensibilizzazione (l'obiettivo di una campagna è di inviare messaggi, SMS/EMail) utilizzando strumenti appositi.

La gestione dell'operatività di una campagna (per semplicità da adesso dirò campagna) consiste nel far partire un "processo" che esegue il seguente algoritmo:
0 i=1
1 preleva l'i-esimo sottoinsieme di destinatari
2 si il sottoinsieme non è vuto
3 per ogni destinatario
4 invia il messaggio al destinatario
5 i = i + 1
5 riparti dal punto 1

in pratica si prelevano a piccole quantità un set di destinatari, e per quel sottoinsieme, si inviano singolarmente i messaggi.

Una campagna può essere messa in pausa e fatta ripartire, semplicemente cambiando lo stato nel database.

Il sistema deve eseguire più campagne contemporaneamente.
Il sistema deve garantire che, in caso di interruzioni, sarà possibile ripristinare la campagna dal punto in cui si è fermata.

Il contesto tecnico relativo all'implementazione è Java con Spring Boot.

Ho pensato ad una soluzione che prevedeva l'utilizzo di Spring Batch, dove per ogni batch intendevo gestire una campagna, ma mi sono arreso quando ho cercato di rendere un ItemReader parametrico, nel senso che ogni batch , essendo dedicato ad una apposita campagna, doveva avere un Reader appositamente configurato con l'id della campagna.

Ho pensato poi invece ad una soluzione che prevedeva un pool di thread (ThreadPoolTaskScheduler) governati appunti da uno scheduler che ogni tot controlla se c'è una campagne da avviare e l'avvia.

Ho molti dubbi e vorrei cominciare a confrontarmi con qualcuno che ha voglia di farlo.

Grazie in anticipo.

2 Risposte

  • Re: Spring Boot - Multi thread

    skugnizzo78 ha scritto:


    Ho pensato ad una soluzione che prevedeva l'utilizzo di Spring Batch, dove per ogni batch intendevo gestire una campagna, ma mi sono arreso quando ho cercato di rendere un ItemReader parametrico, nel senso che ogni batch , essendo dedicato ad una apposita campagna, doveva avere un Reader appositamente configurato con l'id della campagna.
    Non me ne intendo granché (anzi, poco/nulla) di Spring Batch ma in realtà credo che hai valutato "male" la questione. Il punto NON è avere un XyzItemReader che "sa" di dover gestire una campagna specifica (perché es. lo crei tu con un parametro). ItemReader è generico, ItemReader<T>. Quindi devi avere una tua classe specifica es. MessaggioCampagna che contiene TUTTE le informazioni, anche la campagna.
    Quindi un tuo XyzItemReader<MessaggioCampagna> sarebbe in grado di gestire un messaggio di una qualunque campagna in base a quanto/dove viene letto.

    Non ho molto ora per valutare oltre ma ... pensaci.
  • Re: Spring Boot - Multi thread

    Grazie innanzitutto, potermi confrontare con altre persone per me è importantissimo.
    A naso la soluzione che prevede l'utilizzo di Spring Batch non mi convince, in natura il batch è uguale per tutte le campagne, ma considerando che avrò in esecuzione più campagne e che vedo complicato gestire l'ItemReader (ah...grazie per i consigli) volevo provare a capire invece cosa ne pensavi della soluzione che prevede lo scheduler.

    In pratica, in maniera schedulata controllerei se c'è una campagna da mettere in esecuzione, se c'è, andrà in esecuzione in quel thread.
    Il tutto ovviamente in maniera parallela, nel senso che se c'è una campagna in esecuzione e lo scheduler (dopo il tot tempo) ne becca un'altra nello stato "da eseguire" partirebbe anche quella.

    L'idea mi è venuta leggendo qui (non ho avuto ancora tempo per provarla) https://crmepham.github.io/spring-boot-multi-thread-scheduling/

    Che ne pensi?

    Grazie 1000 ancora
Devi accedere o registrarti per scrivere nel forum
2 risposte