2010-03-09 4 views
0

Nous utilisons cette configuration Log4J pour afficher les informations JTA:config Log4J pour les transactions Spring JTA

<category name="org.springframework.transaction"> 
    <priority value="DEBUG"/> 
</category> 

Les entrées du journal qui en résultent sont du type:

15:36:08,048 DEBUG [JtaTransactionManager] [ ] Creating new transaction with name [class]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
15:36:09,564 DEBUG [JtaTransactionManager] [ ] Initiating transaction commit 

... Maintenant, nous utilisons printemps MessageListener écouter une file d'attente MQ. Le problème est que ceci est transactionnel, et nous obtenons l'enregistrement mentionné ci-dessus toutes les 2 secondes. Ce que nous voulons, c'est simplement que ces instructions JTA soient imprimées quand quelqu'un utilise notre API REST pour accéder à des services qui utilisent @Transactional. Nous ne voulons pas que les entrées du journal JTA proviennent de cette implémentation d'écoute MQ "polling".

Pouvez-vous le faire?

Répondre

2

Vous devez définir le niveau de journalisation par défaut supérieur à DEBUG dans votre configuration, puis essayez d'ajuster le niveau de journalisation pour org.springframework.transaction manuellement dans votre API REST dans l'appel approprié, par ex.

public void doSomething() { 
    Logger txLogger = Logger.getLogger("org.springframework.transaction"); 
    Level defaultLevel = txLogger.getLevel(); 
    txLogger.setLevel(Level.DEBUG); 
    // do my stuff 
    txLogger.setLevel(defaultLevel); 
} 

Cela signifie que lors de l'appel à votre API - mais alors seulement - les appels initiés par l'auditeur MQ seraient également enregistrés, mais autant que je sache il n'y a aucun moyen de configurer différents niveaux de log pour la même classe en fonction où il est appelé à partir :-(

Mise à jour: une autre possibilité serait de créer un TransactionManager personnalisé, ce qui serait juste une enveloppe pour celui fourni par printemps transmettrait les appels au printemps et à écrire son propre. Vous utiliseriez cela dans votre API, mais la version Spring dans le listener MQ, vous auriez alors deux classes distinctes, donc vous pouvez définir différents niveaux de log. assez sûr que c'est possible, mais il peut être plus difficile à configurer et à maintenir que cela vaut la peine ...

+0

C'est une solution de contournement décent ... supposons que ce que je cherche est ce que vous dites n'est pas disponible - pour configurer différents niveaux de journal pour la même classe en fonction de l'endroit où il est appelé –

+0

Personnalisé 'TransactionManager' est une belle idée. Comme vous le dites, peut-être plus de tracas que de valeur. –

1

Je suppose que vous utilisez DefaultMessageListenerContainer, n'est-ce pas? Cela interroge activement la file d'attente JMS, créant un flux constant de transactions.

Il y a une chose que vous pourriez essayer, et j'hésite à le suggérer, mais vous pourriez envisager d'utiliser SimpleMessageListenerContainer à la place. Cela n'interroge pas JMS, il s'appuie sur JMS pour lui envoyer des messages à la place. C'est plus simple (d'où le nom), mais moins fiable dans certaines configurations JMS. Comme il est plus passif, il génèrera moins de charge de transaction, et donc moins de bruit de journal. J'hésite à le suggérer parce que changer votre conception pour réduire le bruit de notation n'est probablement pas une bonne idée.

+1

Notre classe implémente 'MessageListener'. C'est l'étendue de mes connaissances ... semble définitivement être sondage. L'utilisation de 'SimpleMessageListenerContainer' semble une bonne idée ... mais comme vous le mentionnez, vous ne savez pas si nous voulons changer notre conception. Nous avons utilisé avec succès l'approche actuelle sur d'autres projets, pas sûr de vouloir essayer quelque chose de nouveau juste pour des options de journalisation plus pratiques. –

+0

@Marcus: C'est probablement sage. Par ailleurs, le 'MessageListenerContainer' est le composant Spring de la colle-logique qui relie' MessageListener' de votre application à JMS. – skaffman

Questions connexes