2009-06-10 5 views
1

Donc, voici mon problème:
J'ai un message géré par le bean X et je voudrais utiliser Logger dans la méthode onMessage() de X. Supposons que j'ai une seule instance du bean en cours d'exécution dans mon serveur d'application, par conséquent, je voudrais initialiser log4j dans ejbCreate(). Cela signifierait que je devrais faire quelque chose comme ceci:Log4j pour les beans gérés par message

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

Cependant, cela n'aide pas. Peu importe ce que je fais, je reçois toujours mon flux comme nul, j'ai essayé d'autres versions: this.getClass(). GetStream() et ResourceBundle.

J'ai jar'ed mon fichier de propriétés dans test.jar et l'a ajouté sous les bibliothèques EAR (j'utilise RAD7) et il s'est reflété dans mon manifeste.mf.

Quelqu'un at-il déjà fait face à ce problème? Si oui, comment l'avez-vous résolu? votre aide ... Appréciez

Répondre

1

Je ne recommande pas de configurer log4j dans la méthode de création EJB. Plusieurs EJBeans peuvent être activés/passivés au gré des conteneurs selon la spécification J2EE. Il est donc possible que vous finissiez par configurer log4j plusieurs fois. Recommandez d'utiliser des beans de démarrage dont l'invocation est garantie seulement 1 fois.

+0

Qu'est-ce qu'un bean de démarrage? et comment vous assurez-vous qu'il est invoqué une seule fois? – Jay

+0

n Le bean de démarrage de l'application est un bean session qui est chargé au démarrage d'une application. Les beans de démarrage d'application permettent aux applications J2EE d'exécuter automatiquement une logique métier chaque fois qu'une application démarre ou s'arrête normalement, mais uniquement une fois. – zkarthik

2

Si vous obtenez ce à l'intérieur d'un fichier JAR, alors vous manque un iniitial /:

Classloader.getResourceAsStream("/xyz_log4j.properties") 

Et en fonction de ce répertoire contient le fichier de propriétés, vous devez spécifier un chemin vers ce répertoire par rapport au sommet de la hiérarchie de classe. Par exemple, si ce fichier de propriétés est dans le même répertoire que net.mine.Program, vous feriez ceci:

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

Je ne crois pas que vous pouvez lire à partir du répertoire META-INF utilisant getResourceAsStream(), mais je n'ai jamais essayé donc peut-être il y a un moyen de le faire.

1

Vous pouvez essayer de coder en dur le nom de la classe dans la charge.

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

Sinon, vous pouvez regarder dans SLF4J. Qui est une façade qui peut s'asseoir sur LOG4J. L'API est la plupart du temps identique (même créateur que je crois), et SLF4J ne nécessite pas d'appel d'initialisation explicite, ce qui simplifie un peu les choses.

+0

Uniquement si le fichier de propriétés se trouve dans le même répertoire que la classe. – Eddie

+0

Je pense que vous avez raison, mais il y a peut-être un moyen d'ajuster le chemin. –

Questions connexes