2015-04-07 8 views
5

Ich muss einen einfachen Zähler beibehalten, der innerhalb der Anwendung für alle Benutzer und alle Knoten in einer Clusterumgebung eindeutig ist. Ich dachte über das Singleton Session Bean Anmerkung javax.ejb.Singleton mit etwa so:Wie Singleton ist javax.ejb.Singleton in einer Clusterumgebung?

package foo; 

import javax.ejb.Singleton; 

@Singleton 
public class Bean { 
    private int counter; 
    [...] 
} 

Das sieht einfach, aber ich konnte keine Antwort finden, wenn diese in einer Cluster-Umgebung wie gewünscht funktioniert. Würde jeder Knoten des Clusters eine eigene Instanz haben oder nicht?

Natürlich könnte ich die Bean in einer Datenbank persistieren, aber es ist wirklich nur ein Zähler und dies wäre Overkill. Außerdem möchte ich, dass der Zähler beim Absturz der Anwendung oder bei einem Neustart zurückgesetzt wird. Wenn Sie also fortfahren, würde dies zu mehr Problemen führen, als gelöst werden können.

+0

Auch wenn Sie es beibehalten möchten, ist die Lösung möglicherweise kein vollständiger Beweis. Was passiert, wenn eine Anforderung auf Knoten 2 auftritt, während Knoten 1 beschäftigt ist, den aktualisierten Zählerwert beizubehalten? :-) – Abhishek

+0

Wenn Sie db verwenden, das Sequenzen unterstützt, können Sie sie verwenden. Warum? Weil ich denke, es ist die beste zuverlässige Lösung. In Ihrem Singleton können Sie Lebenszyklus-Annotationen verwenden, um einen Vorgang zum Zurücksetzen der Sequenz auszuführen, egal ob beim Start oder bei der Zerstörung, abhängig von Ihnen. – Raman

+0

Ich muss hoch und runter zählen und der App-Server hat einen anderen Lebenszyklus als die Datenbank, also funktioniert das nicht, aber danke. –

Antwort

9

Hätte jeder Knoten des Clusters eine eigene Instanz oder nicht?

Ja, jeder Clusterknoten hat eine andere Singleton-Instanz. Daher ist @Singleton Annotation nicht die Lösung für Ihr Problem.

Beachten Sie, dass die Java EE-Spezifikation kein Clusterverhalten definiert. Sie müssen nach einer bestimmten Anbieterlösung suchen, um diese Anforderung zu erfüllen. Nur als ein Beispiel siehe .

+0

Danke. Ich frage mich, ob es eine Option gibt, ohne von einem bestimmten Produkt abhängig zu sein. Vielleicht hack JNDI oder so? –

+1

Ich denke, es könnte möglich sein, Ihre eigene Lösung zu implementieren, aber Sie werden auf Probleme (Herausforderungen) stoßen, die bereits von spezialisierten Entwicklerteams gelöst wurden. –

2

Sie könnten hazelcast verwenden. Es ist ein verteilter speicherinterner Schlüsselwertspeicher. Es scheint, als wäre es eine perfekte Passform. Es implementiert auch JSR-107, die JCache-Spezifikation.

-2

Ha Singleton ist ein Ansatz. Als Fortschritt gibt es einige Einschränkungen. Wenn Sie lesen, haben Sie eine @stateless-Bean, die über eine "getValue()" -Methode auf den Service zugreift. Der get-Wert ruft die Methoden eines Singleton-Beans auf und gibt Ihnen einen Wert ... bis dahin.

Aber wenn Sie mit der Bean arbeiten müssen, sollte eine Strategie eine SingletonBean-Instanz durch get Wert zurückgeben, aber .. Sie werden mehr Instanzen dieser Singleton Bean haben .... und da ist das Problem.