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?

Était-ce utile?

La solution

On dirait un bon cas d'utilisation pour , 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top