Domanda

Ora i miei colleghi lavorano sulla registrazione del sottosistema e vogliono legare operazioni separate, che sono state avviate da alcuni metodi commerciali. Ad esempio, se il metodo di Bean A chiama un metodo in Bean B e poi in Bean C sarà bello sapere rispetto ai metodi aziendali in Bean B e Bean C fa un po 'di personale per il metodo di Bean A. Soprattutto sarà ottimo Sappi che i metodi di B e C hanno svolto alcune unità di lavoro per Call Call of Bean A.

Quindi, la domanda è come legare queste unità di lavoro in qualcosa in totale? Ovviamente, non è bello usare gli argomenti del metodo per vincolare!

E penso anche che sia tempo di porre un'altra domanda, che è abbastanza vicino a quella precedente. E se volessi propagare alcune informazioni di contesto da Bean A a Another Beans, che vengono chiamate da A? Qualcosa come le credenziali di sicurezza e il capitale della sicurezza? Cosa posso fare? Potrebbero essere domande che ho fatto è una specie di cattiva pratica?

È stato utile?

Soluzione

Sembra un buon caso d'uso per , disponibile in entrambi Logback e Log4j. Essenzialmente stai allegando un valore personalizzato a un thread e tutti i messaggi di registrazione che comunicano da quel thread possono allegare quel valore al messaggio.

Penso che il modo migliore per implementarlo in EJB sarà un intercettore:

public class MdcInterceptor {

    @AroundInvoke
    public Object addMdcValue(InvocationContext context) throws Exception {
        MDC.put("cid", RandomStringUtils.randomAlphanumeric(16));
        try {
            return context.proceed();
        } finaly {
            MDC.remove("cid");
        }
    }
}

Ora tutto quello che devi fare è aggiungere:

%X{user}

al tuo modello di registrazione (logback.xml o log4j.xml).

Guarda anche

Altri suggerimenti

Per le informazioni sul contesto di scopi generici che puoi utilizzare TransactionsyncronizationRegistry. Potrebbe assomigliare a questo:

@Stateless
public class MyBean {

    @Resource
    TransactionSynchronizationRegistry registry;

    @AroundInvoke
    public Object setEntryName(InvocationContext ic) throws Exception {
        registry.putResource(NAME, "MyBean");
        return ic.proceed();
    }
}

@Stateless
public class MyBean2 {

    @Resource
    TransactionSynchronizationRegistry registry;

    public void doJob() {
        String entryName = (String)registry.getResource(NAME);
        ...
    }
}

Credo che di solito sia implementato usando ThreadLocal Variabili come normalmente ciascuna transazione mappa a un thread Sigle nei server dell'applicazione. Pertanto, se le transactionsyncronizationRegistry non sono implementate nell'AS (come EG in JBoss 4.2.3) o è necessario uno strumento di livello inferiore, è possibile utilizzare direttamente le variabili threadlocal.

A proposito, immagino che le utility MDC utilizzino la stessa cosa sotto le copertine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top