|
|
Re: OC4j :: Log4j :: JMSAppender: msg#00395
java.czech
|
Subject: |
Re: OC4j :: Log4j :: JMSAppender |
Úplně stejný problém jsem řešil já
- tedy setkal jsem se s ním teprve ve chvíli, kdy jsem přešel na Log4J
verze 1.3aplha-8, kde jsem chtěl využít logování přes DataSource
uložený v JNDI. Můj problém je v tom, že log4j (např. pokud bylo v
nějaké statické třídě jako globální proměnná logger Log4J)
inicializoval appendery a loggery ve fázi, kdy je EAR inicializován a
nebylo možné v této fázi nastartovat transakci.
Musel jsem to obejít přetížením tříd log4j a vyřešení tohoto problému
takto:
import org.apache.log4j.db.JNDIConnectionSource;
/**
* Upravuje nevhodné chování DBAppenderu při inicializaci Oracle.
*
* @author Jan Novotný
*/
public class Log4JJNDIConnectionSource extends JNDIConnectionSource {
/**
* @see org.apache.log4j.spi.OptionHandler#activateOptions()
*/
public void activateOptions() {
try {
//pokusíme se opatrně ověřit funkčnost JNDI Connection
Source
System.out.println("LOG4J-JNDI - Activate options -
connection source ... ");
super.activateOptions();
} catch (Throwable e) {
//Ups - chybka ... je možné že ještě nemáme přístupný JNDI
Context ... odložíme inicializaci na později.
System.out.println("LOG4J-JNDI-NOVOJ - Activate options -
connection source ... failed");
e.printStackTrace(System.out);
}
}
}
A JEŠTĚ JEDNA TŘÍDA
import org.apache.log4j.db.DBAppender;
import org.apache.log4j.db.ConnectionSource;
import org.apache.log4j.spi.LoggingEvent;
/**
* Upravuje nevhodné chování DBAppenderu při inicializaci Oracle.
*
* @author Jan Novotný
*/
public class Log4JDBAppender extends DBAppender {
private boolean initializedProperly = false;
public void activateOptions() {
try {
//pokusíme se opatrně aktivovat appender
System.out.println("JNDI Log4J - aktivuji appender ... ");
super.activateOptions();
initializedProperly = true;
} catch (Throwable e) {
//hups nepovedlo se .... no nic zkusíme to při další
příležitosti
System.out.println("JNDI Log4J - chyba při aktivaci
appender (toto může být v pořádku): " + e.getLocalizedMessage());
} finally {
// all nice and dandy on the eastern front
this.active = true;
}
}
protected void append(LoggingEvent event) {
//něco se pokakalo při načítání konfigurace DS ... takže ho
zkusíme reaktivovat
ConnectionSource connectionSource = getConnectionSource();
//pokud je typ dialektu neznámý, znamená to, že se CS je zatím
neinicializovaný - zkusíme to tedy znovu
if (!initializedProperly &&
connectionSource.getSQLDialectCode() !=
ConnectionSource.UNKNOWN_DIALECT) {
if (connectionSource instanceof Log4JJNDIConnectionSource) {
System.out.println("F1 JNDI Log4J - rekonfiguruji
connection source ... ");
connectionSource.activateOptions();
}
//pokusíme se reaktivovat i appender
System.out.println("F1 JNDI Log4J - rekonfiguruji appender
... ");
activateOptions();
}
//pokud se povedlo napodruhé zalogujeme, jinak holt smůla
if (initializedProperly) {
//další oprava - DBAppender si neuměl poradit s velkými
logovanými zprávami
super.append(new Log4JTrimmedLoggingEvent(event));
} else System.out.println("F1 JNDI Log4J - appender
neinicializován - log bude zahozen ...");
}
}
V podstatě jsem ignoroval chyby při neúspěšné inicializaci DS a logoval
je na system out až do doby, než se inicializace povedla - pak už vše
pokračuje normálně (tzn. jakmile se aplikace už nahodila a došlo k
nějakému volání, kde už byly transakce k dispozici).
Tím jsem si svůj problém vyřešil a běhá mi to bez problémů. Obdobné by
to mohlo být i toho JMS.
Honza Novotný
Ing. Jan Novotný
analytik návrhář
Corpus Solutions a.s.
Vaclav Stumbauer napsal(a):
Zdravim,
rad bych na session facade v pripade vypocetne dlouho trvajicich operaci
predaval informaci o jejich prubehu pres JMS.
Problem nastava pri deploymentu aplikace na OC4J. V okamziku vytvareni
instance prvni session beany v ramci ktere je inicializovano i log4j
dojde k nasledujicimu problemu:
javax.naming.NamingException: Not in an application scope - start Orion
with the -userThreads switch if using user-created threads
-userThreads jsem oc4jcku davat zkousel, ale nepremava.
Zda se ze chyba nastava ve chvili, kdy se log4j pokousi
lookupnout v jndi navazanou topic connection factory.
Mate nejaky napad?
diky
Vasek Stumbauer
|
| |