ID de corrélation EJB3
-
27-10-2019 - |
Question
Maintenant, mes collègues travaillent sur le sous-système de l'exploitation forestière et ils veulent lier des opérations distinctes, qui a été lancé à partir d'une méthode d'affaires. Par exemple, si la méthode des appels haricots A à une méthode de haricot B puis dans le haricot C, il sera bon de savoir que les méthodes d'affaires dans le haricot B et le haricot C fait un peu de personnel pour la méthode de la fève A. Surtout, il sera génial de savoir que les méthodes de B et C fait une unité de travail pour les appels en béton de haricot A.
Alors, la question est de savoir comment lier ces unités de travail en quelque chose total? De toute évidence, il est pas beau d'utiliser des arguments de méthode pour lier!
Et je pense aussi qu'il est temps de poser une autre question, qui est assez proche de la précédente. Que faire si je veux propager des informations de contexte de la fève A à un autre haricots, qui sont appelés de A? Quelque chose comme des informations d'identification de sécurité et principal de sécurité? Que puis-je faire? Peut-être des questions que je posais est une sorte de mauvaise pratique?
La solution
On dirait un bon cas d'utilisation pour mdc , disponible en Logback et log4J . Essentiellement, vous attachez une valeur personnalisée à un fil et tous les messages de journalisation de ce thread comming peut fixer cette valeur au message.
Je pense que la meilleure façon de mettre en œuvre ce EJB sera intercepteurs :
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");
}
}
}
Maintenant, tout ce que vous avez à faire est d'ajouter:
%X{user}
à votre motif d'enregistrement (ou de logback.xml
log4j.xml
).
Voir aussi
Autres conseils
Pour plus d'informations de contexte d'usage général, vous pouvez utiliser TransactionSynchronizationRegistry . Il pourrait ressembler à ceci:
@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);
...
}
}
Je crois qu'il est généralement mis en œuvre en utilisant ThreadLocal comme variables normalement chaque transaction cartes à un fil de Sigle dans les serveurs d'application. Donc, si TransactionSynchronizationRegistry n'est pas mis en œuvre dans votre AS (comme par exemple dans JBoss 4.2.3) ou vous avez besoin outil inférieur niveau, vous pouvez utiliser des variables ThreadLocal directement.
BTW Je suppose que les services publics MDC utilisent la même chose sous les couvertures.