Ú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.

Telefon HK: +420 49 553 21 54
Telefon centrála: +420 24 102 03 33
Email: [EMAIL PROTECTED]
WWW: http://www.corpus.cz



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








  

Odpovedet emailem