Bonjour a tous
Je débute avec spring (pour ne pas dire avec les avec applications servers...) et j'aurai quelques précisions à vous demander :
J'utilise Spring avec les annotations ...
Dans mon cas je voudrais créer un cas d'école : producteur-consommateur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
@Component("faxPile")
@Scope(value = BeanDefinition.SCOPE_SINGLETON)
public class FaxPile implements IFaxPile {
private List<IFaxModel> faxsPile;
private FaxThread faxThread;
public FaxPile() {
faxsPile = new ArrayList<IFaxModel>();
System.out.println("FaxPile = "+this);
start();
}
public void start() {
if (getFaxThread() == null) {
setFaxThread(new FaxThread());
getFaxThread().setDaemon(true);
getFaxThread().start();
System.out.println("<<<<< FaxThread Started >>>>>>");
}
}
public class FaxThread extends Thread {
@Override
public void run() {
System.out.println("<<<<< FaxThread starting >>>>>>");
while (!isInterrupted()) {
try {
IFaxModel faxModel = getFax();
getFaxManager().generateFax(faxModel);
} catch (InterruptedException e) {
getMailService().sendException(e);
}
}
System.out.println("<<<<< FaxThread Stopped >>>>>>") getMailService().sendMailSystemError(IFaxResult.TypeError.INTERRUPTED_ERROR);
}
}
} |
J'ai donc crée une classe FaxPile qui lance un thread. Ce thread va récupérer les valeurs à "consommer" dans une liste.
Mon problème est que bien que j'ai mis l'annotation
@Scope(value = BeanDefinition.SCOPE_SINGLETON)
Ma classe FaxPile est instanciée plusieurs fois...
Lorsque qu'on l'on definit singleton=true ou scope=singleton dans les dernières versions de Spring, on considère que le Bean n'est justement PAS sous forme de Singleton, c'est le conteneur léger Spring qui ne va instancier qu'une seule fois le bean, il sera unique mais rien n'empécherai en théorie d'instancier par ailleurs ce bean.
Au risque de passer pour un noobs ( ce que je suis ceci dit) pourrait on m'expliquer cette nuance entre l'instanciation par le conteneur léger de spring et l'instanciation " par ailleurs [de] ce bean."
Si j'ai bien compris les explications de JeanDavidKevin, mon annotation ne suffit pas à faire en sorte que la classe ne soit instancié qu'une seule fois dans mon application ?
- Comment puis y remedier car cette classe FaxPile contenant la liste des objets a consommer est référencée (par injection ) dans plusieurs autres classes (il faut donc que ma classe FaxPile soit la même partout)
- De plus le lancement du thread est fait dans le constructeur de ma classe FaxPile. Est une erreur ?
Merci d'avance pour vos réponses
a+
Partager