2009-06-10 7 views
1

Also, hier ist mein Problem:
Ich habe eine Message-Driven Bean X und möchte Logger in X onMessage() -Methode verwenden. Nehmen wir an, dass ich eine einzelne Instanz der Bean auf meinem App-Server laufen lasse, daher würde ich log4j in ejbCreate() initialisieren. Das würde bedeuten, dass ich so etwas tun müsste:Log4j für Message Driven Beans

public void ejbCreate() { 
    PropertyConfigurator.configure(Classloader.getResourceAsStream("xyz_log4j.properties")); 
} 

Allerdings hilft das nicht. Egal, was ich mache, ich bekomme immer meinen Stream als null, ich habe andere Versionen ausprobiert: this.getClass(). GetStream() und ResourceBundle.

Ich habe meine Eigenschaftendatei in test.jar eingetippt und unter EAR-Bibliotheken hinzugefügt (ich verwende RAD7), und sie wurde in meiner manifest.mf widergegeben.

War jemand mit diesem Problem konfrontiert? Wenn ja, wie haben Sie es gelöst? Schätzen Sie Ihre Hilfe ...

Antwort

1

Ich würde nicht empfehlen, log4j in der EJB create-Methode zu konfigurieren. Mehrere EJBeans können bei den Containern nach J2EE-Spezifikation aktiviert/passiviert werden. Es besteht also die Möglichkeit, log4j mehrere Male zu konfigurieren. Empfehlen Sie Start-Beans, die garantiert nur einmal aufgerufen werden.

+0

Was ist eine Start-Bean? und wie stellen Sie sicher, dass es nur einmal aufgerufen wird? – Jay

+0

n Anwendungsstart-Bean ist eine Session-Bean, die beim Start einer Anwendung geladen wird. Anwendungsstart-Beans ermöglichen J2EE-Anwendungen, Geschäftslogik automatisch auszuführen, wenn eine Anwendung normal gestartet oder gestoppt wird, wenn auch nur einmal. – zkarthik

2

Wenn Sie bekommen diese aus dem Inneren einer JAR-Datei, dann ein Sie fehlt iniitial /:

Classloader.getResourceAsStream("/xyz_log4j.properties") 

Und je nachdem, welchem ​​Verzeichnis enthält die Eigenschaftendatei, Sie müssen einen Pfad zu diesem Verzeichnis relativ zum Anfang der Klassenhierarchie angeben. Zum Beispiel, wenn diese Eigenschaften-Datei im selben Verzeichnis wie net.mine.Program, dann würden Sie dies tun:

Classloader.getResourceAsStream("/net/mine/xyz_log4j.properties") 

Ich glaube nicht, Sie aus dem Verzeichnis META-INF getResourceAsStream() mit lesen können, aber ich habe nie versucht, vielleicht gibt es einen Weg, es zu tun.

1

Sie könnten versuchen, den Klassennamen in die Last zu schreiben.

<name of your class>.class.getResourceAsStream(fileName); 

Alternativ dazu können Sie in SLF4J suchen. Welche Fassade kann auf LOG4J sitzen? Die API ist meistens die selbe (der selbe Schöpfer glaube ich), und SLF4J benötigt keinen expliziten Initialisierungsaufruf, was die Dinge ein wenig vereinfacht.

+0

Nur wenn sich die Eigenschaftendatei im selben Verzeichnis wie die Klasse befindet. – Eddie

+0

Ich denke, Sie haben Recht, aber vielleicht gibt es eine Möglichkeit, den Pfad anzupassen. –