Come
funziona il sistema
I requisiti fodamentail per la architettura del sistema sono
i seguenti:
- un
indirizzo di posta elettronica;
- un
server per l'invio mail;
- un
list-server;
Schematicamente
possiamo descrivere il flusso e la locazione del mailing list
server come in figura 1:
Figura 1 - macro architettura del sistema
Il list-server è quello strumento che permette di creare,
di modificare e di cancellare una singola mailing-list o gli
indirizzi appartenenti ad essa. Il mailing-list server è
invece il sistema che gestisce l'invio dei messaggi a tutti
gli utenti della lista creata; il server di posta invia le
mail.
Il
mailing-list server
Il sistema che creeremo sarà in grado di ripristinare
l'ultimo stato di invio nel caso di crash, per questo adotteremo
la soluzione più intuitiva, cioè quello della
serializzazione delle classi. Disponiamo di due modalità
di invio: una in cui appena invocato un metodo si invia il
messaggio alla mailng-list; un'altra in cui, oltre ai parametri
precedenti, si specifica anche la data di invio (compresa
l'ora/minuto). Ci sarà quindi una classe Timer, che
permetterà di schedulare i Jobs (mailing-list con messaggi)
e quindi inserirli nella coda di invio quando la data è
"scaduta".
Infine l'invio di un messaggio consentirà a chi lo
riceve di non vedere gli altri utenti della mailing-list.
Questo sistema (Figura 2) può essere implementato da
tre classi principali:
- una,
che chiameremo MailingListServer, riceverà le chiamate
da un list-server;
- una,
ListJobs, che gestirà le code di invio. Le code di
invio saranno due: una che gestirà i Jobs, con data
e/o ora (scheduledJobs), ed una che contiene i Jobs da inviare
immediatamente (currentJobs);
- ed
infine una classe che spedirà le mail, e la chiameremo
MailSender.
Tutte le altre che creeremo, saranno di supporto alle classi
appena citate.
Figura 2 - Architettura del codice
In
questa parte dell'articolo, ci occuperemo solo della classe
MailingListServer. Essa includerà certamente due metodi
send descritti prima. Nel secondo metodo se un Job è
"scaduto", quindi la data attuale è maggiore
della data di inserimento del Job, dal Vector scheduledJobs
viene passato al SortedSet currentJobs.
In questo sistema, c'è un thread che controlla la struttura
currentJobs; quando un elemento è disponibile per essere
processato, il thread lo estrae dal SortedSet e lo invia al
MailSender,il quale provvederà a spedirlo.
Occorre
costruire la struttura del messaggio (MailMessageInfo) e quella
della mailing list(MailingListData). La struttura è
abbastanza intuitiva:
- String
from;
- String
subject;
- String
message;
- String
attachmentPath;
- String[]
attachments.
Indicheremo
con questi campi, rispettivamente, la mail da cui si invia,
l'oggetto e il messaggio; con attachmentPath indicheremo il
path in cui troveremo gli attachments ed infine l'array attachments
comprenderà i nomi dei files.
MailinListData contiene le informazioni della mailing-list,
quindi:
- String
name;
- String[]
addresses.
Nei
due metodi send è da notare come si riceve in input
un array di mailing-list. Questo vuol dire che è possibile
inviare uno stesso messaggio a più mailing-lists. Quindi,
particolare attenzione si farà quando si invierà
il messaggio, visto che bisognerà almeno eseguire due
cicli annidati, uno per scorrere le mailingl-lists, un altro
per scorrere gli indirizzi dentro una mailing-list.
In questi metodi andremo ad inserire un Job o nel Vector scheduledJobs
(se l'invio deve partire dopo una certa data) oppure nel SortedSet
currentJobs (se l'invio deve essere immediato). Il Job è
così composto:
- Date
beginDate;
- MailMessageInfo
mailMessageInfo;
- MailingListData[]
mailingListData;
- Infine
dentro i metodi send occorrerà notificare che è
stato effettuato un inserimento nelle code di attesa.
Conclusione
Questa prima parte di una mini-serie di articoli permette
di dare una nozione generale del sistema che andremo a sviluppare.
Per questo motivo, nel prossimo, andremo ad analizzare più
dettagliatamente la gestione delle code per l'invio delle
mails. La seconda parte sarà un po' più complessa,
ma una volta compreso il meccanismo, sarà facile da
implementare!
Bibliografia
e risorse
Java 2 Platform SE v.1.4.2 - http://java.sun.com/j2se/index.jsp
|