2017-10-18 42 views
0
  1. MDC ne fonctionne pas toujours dans le cadre de jeu, car les fonctions sont exécutées dans un pool de threads géré.
  2. Dans ce cas, il est recommandé que MDC.getCopyOfContextMap() soit appelé sur le thread d'origine (maître) avant de soumettre une tâche à l'exécuteur.
  3. Mais le pool de threads est géré par playframework, je ne peux pas invoquer MDC.getCopyOfContextMap() sur le thread d'origine.
  4. Existe-t-il des solutions pour Java? ou puis-je ajouter un aspect pour MDC car je peux obtenir des données dont j'ai besoin manuellement à partir du contexte, et comment faire? Merci
+0

Dans notre projet, nous utilisons le contexte pour passer le traceId. Et j'ai trouvé deux solutions pour résoudre le problème. 1. Personnaliser HttpContextExecution 2. Personnaliser un enregistreur -------------------------------------- --- 1. écris une classe pour implémenter scala.concurrent.ExecutionContextExecutor et imite les méthodes de play.core.j.HttpExecutionContext. 2. Enveloppez simplement l'enregistreur et placez les données issues du contexte dans MDC –

Répondre

1

Il existe un open bug contre Playframework pour cela. Ce rapport de bogue fait uniquement référence à Scala mais le même problème affecte aussi Java puisqu'il est dû au fait que MDC est un thread local mais en Play, une seule requête peut être décomposée en plusieurs sous-appels, chacun pouvant être exécuté sur un thread différent. le MDC n'est pas propagé à tous ces threads.

Il y a quelques solutions proposées ici:

Sinon, vous devrez soit attendre the bug fixe ou accepter que le MDC ne se comportera pas la façon dont votre attendre à ce à.