Dans notre logiciel, nous avons beaucoup utiliser les MDC suivre les choses comme Id de session et les noms d'utilisateur pour les requêtes web. Cela fonctionne bien lors de l'exécution dans le thread d'origine. Cependant, il y a beaucoup de choses qui doivent être traitées en arrière-plan. Pour cela nous utilisons l' java.concurrent.ThreadPoolExecutor
et java.util.Timer
les classes avec quelques roulées async services d'exécution. Tous ces services gèrent leur propre pool de threads.
C'est ce que Logback manuel a à dire sur l'utilisation de MDC dans un tel environnement:
Une copie de la mappé contexte diagnostique ne peut pas toujours être héritées par les threads de l'ouverture de la thread. C'est le cas de java.util.de façon concomitante.Les exécuteurs testamentaires est utilisé pour la gestion des threads. Par exemple, newCachedThreadPool méthode crée un ThreadPoolExecutor et comme les autres fil groupement de code, il est complexe de création de thread logique.
Dans de tels cas, il est recommandé que le MDC.getCopyOfContextMap() est appelée sur l'original (master) thread avant de soumettre une tâche à l'exécuteur testamentaire. Lors de l'exécution de la tâche, en tant que sa première action, il doit invoquer le MDC.setContextMapValues() pour associer la copie de l'original MDC valeurs avec le nouvel Exécuteur testamentaire géré fil.
Ce serait bien, mais il est très facile d'oublier l'ajout de ces appels, et il n'est pas facile de reconnaître le problème jusqu'à ce qu'il soit trop tard. Le seul signe avec Log4j est que vous obtenez manquant MDC de l'info dans les journaux, et avec Logback vous obtenir rassis MDC info (depuis le fil dans la bande de roulement piscine hérite de sa MDC de la première tâche qui a été couru sur celui-ci). Les deux sont de graves problèmes dans un système de production.
Je ne vois pas notre situation particulière, en quelque sorte, mais je ne pouvais pas trouver beaucoup sur ce sujet sur le web. Apparemment, ce n'est pas quelque chose que beaucoup de gens se heurtent, donc il doit y avoir un moyen de l'éviter. Que faisons-nous du mal ici?