EJB3 ID di correlazione
-
27-10-2019 - |
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?
Soluzione
Sembra un buon caso d'uso per MDC, 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.