1

Ich möchte ein Singleton-Objekt in meinem Jersey 1.19.1 Webservice haben, das dieselbe Instanz über alle meine Glassfish-Knoten ist. Dies ist meine aktuelle Implementierung:Java Jersey REST Webservice: Es ist nicht möglich, eine Singleton Bean über alle Clusterknoten zu erstellen

@Singleton 
@ApplicationScoped 
@Stateless 
public class ValueObject { 

    public long downloads = 0; 

} 

und

@Path("downloads") 
public class Downloads { 

    @InjectParam 
    private ValueObject singleton; 

} 

Der Zähler erhöht wird, wenn eine Datei heruntergeladen wird. Nach dem Herunterladen einer Datei und der Abfrage nach dem DownloadCounter 1 und 0 wird zurückgegeben, je nachdem, welcher der beiden Glassfish-Knoten die Anforderung verarbeitet hat.

Mein Ziel ist es immer 1 zu bekommen. Wie kann ich das erreichen?

Ohne @ApplicationScoped oder @Stateful statt @Stateless führt zum gleichen Ergebnis.

Grüße

John

Antwort

0

Dies ist mit Glassfish nicht möglich. Wie in this StackOverflow answer diskutiert, wird die EJB @Singleton Annotation eine Instanz pro JVM, gemäß der EJB 3.1-Spezifikation haben:

A Singleton Session Bean eine Session-Bean-Komponente, die einmal pro Anwendung instanziiert wird. In Fällen, in denen der Behälter über viele virtuellen Maschinen verteilt wird, wird jede Anwendung für jede JVM eine Bean-Instanz des Singleton hat

Die Antwort auch erwähnt, dass Wildfly 10 einen Mechanismus, dies zu unterstützen, aber dies ist ein proprietäre Lösung, und nicht eine in GlassFish gefunden.

Eine Lösung wird derzeit für Payara Server untersucht, obwohl dies noch nicht implementiert ist.

Verwandte Themen