Ho dichiarato un bean Spring, che esegue il polling del mio server di posta ogni tanto e così secondi. Se c'è la posta, la recupera e cerca di estrarre tutti i file allegati. Questi file vengono quindi inviati a un Uploader che li salva in modo sicuro. Anche l'uploader viene dichiarato come bean Spring. Un terzo bean associa il mittente dell'email al nome file del file e lo memorizza in un DB.Con l'ambito bean predefinito come singleton, non sarà pericoloso quando si verificano chiamate simultanee?
Si è scoperto che quando alcune persone hanno provato a inviare e-mail nello stesso momento, è accaduto un sacco di cose confuse. I record nel DB hanno nomi di file errati. Alcuni non hanno ricevuto alcun nome di file, ecc.
Ho attribuito il problema al fatto che i bean hanno l'ambito di singleton per impostazione predefinita. Ciò significa che un mucchio di thread probabilmente stanno facendo confusione con uno e la stessa istanza allo stesso tempo. La domanda è come risolverlo.
Se sincronizzo tutti i metodi sensibili, tutti i thread si accumuleranno e attenderanno l'un l'altro, il che è un po 'come l'idea del multithreading.
D'altra parte, scoping i fagioli alla "richiesta" sta per creare nuove istanze di ciascuno di essi, che non è veramente buono o, se si parla di consumo di memoria e programmazione dei thread
Sono confuso. Cosa dovrei fare?
È necessario sincronizzare i metodi, ma ancora più importante è necessario assicurarsi che i metodi chiamati non stiano modificando i dati di istanza su cui si basano altri thread. Sto solo supponendo che tu non abbia fornito il tuo codice, ma probabilmente è molto più della semplice sincronizzazione dei metodi. Sembra che tu abbia un problema sistemico di sovrascrittura dei dati prima che tu abbia finito con quello. –