Wie Schreibe ich ein Java-EE/EJB Singleton?

Einen Tag vor meiner Bewerbung war mit einem OHR, mit einem KRIEG, einem EJB-JAR und ein paar Dienstprogramm JAR-Dateien. Ich hatte ein POJO-singleton-Klasse, in einem der utility-Dateien, es funktionierte, und alles war gut mit der Welt:

EAR
 |--- WAR
 |--- EJB JAR
 |--- Util 1 JAR
 |--- Util 2 JAR
 |--- etc.

Dann habe ich mir eine zweite KRIEG und fand heraus (auf die harte Weise), dass jeder KRIEG hat seine eigenen Klassenlader, so dass jeder KRIEG sieht anders singleton, und Dinge brechen von dort aus. Das ist nicht so gut.

EAR
 |--- WAR 1
 |--- WAR 2
 |--- EJB JAR
 |--- Util 1 JAR
 |--- Util 2 JAR
 |--- etc.

So, ich bin auf der Suche nach einem Weg, um erstellen Sie eine Java-singleton-Objekt, das funktioniert über Kriege (über Classloadern?). Die @Singleton EJB-annotation schien Recht vielversprechend, bis ich herausfand, dass JBoss 5.1 scheint nicht zur Unterstützung der annotation (die Hinzugefügt wurde, die als Teil der EJB-3.1). Hab ich da was verpasst - kann ich @Singleton mit JBoss 5.1-Software? Ein Upgrade auf JBoss AS 6 ist keine option jetzt.

Abwechselnd, ich wäre nur so glücklich, nicht zu verwenden EJB implementieren meinem singleton. Was kann ich sonst noch tun um dieses problem zu lösen? Im Grunde brauche ich einen semi-Anwendung-breit* Haken in eine ganze Reihe von anderen Objekten, wie die verschiedenen Cache-Daten-und app-config-info. Als letzten Ausweg habe ich bereits als Verschmelzung meiner beiden Kriege in einem, aber das wäre ziemlich höllisch.

*Bedeutung: verfügbar im Grunde überall oberhalb einer bestimmten Ebene, für die nun größtenteils in meinen WARs - the View und Controller (in einem weiteren Sinne).

Edit: sollte ich wirklich anrufen, es Java EE anstatt J2EE, sollte ich nicht?


Edit 2: Vielen Dank nochmal an @Yishai für all die Hilfe. Nach einigen trial-and-error-es sieht aus wie ich habe herausgefunden, wie die Verwendung eines einzigen ClassLoader über Kriege unter JBoss 5. Ich bin in die Details unten für meinen eigenen Willen, und hoffentlich auch andere das nützlich finden, wie gut.

N. B. dies ist anders, dies zu tun unter JBoss 4 (siehe Yishai Antwort oder meine links unten).

Statt zu schreiben eine jboss-web.xml für jeden KRIEG, und ein jboss.xml für Ohr-EJB-JAR, setzen Sie einen jboss-classloading.xml - Datei in jedem KRIEG, in der gleichen Position wie der DD (web.xml). Der Inhalt jboss-classloading.xml werden sollte:

<?xml version="1.0" encoding="UTF-8"?>
<classloading
    xmlns="urn:jboss:classloading:1.0"
    name="mywar.war"
    domain="DefaultDomain"
    parent-domain="Ignored"
    export-all="NON_EMPTY"
    import-all="true">
</classloading>

Dies folgt aus der JBoss-CW hier, während das, was (glaube ich) arbeitet für JBoss 4.x ist beschrieben hier. Mehr Allgemeine Infos auf JBoss classload(ing/ers):

Als am besten ich kann sagen, die JBoss community wiki-docs sind ziemlich fehlt für JBoss 5 im Vergleich zu JBoss 4.

  • re: Bearbeiten: Nur wenn Sie Arbeit in der Oracle marketing-Abteilung.
InformationsquelleAutor Matt Ball | 2010-05-04
Schreibe einen Kommentar