EJB3 ID корреляции - PullRequest
       8

EJB3 ID корреляции

4 голосов
/ 20 февраля 2012

Теперь мои коллеги работают над подсистемой регистрации и хотят связать отдельные операции, которые были инициированы каким-то бизнес-методом.Например, если метод из bean-компонента A вызывает какой-либо метод в bean-компоненте B, а затем в bean-компоненте C, будет полезно узнать, что бизнес-методы в bean-компоненте B и bean-компоненте C выполняют некоторые функции для метода из bean-компонента A.знать, что методы из B и C выполнили некоторую единицу работы для конкретного вызова компонента A.

Итак, вопрос в том, как связать эти единицы работы в нечто общее?Очевидно, это не красиво использовать аргументы метода для привязки!

А также я думаю, что пришло время задать другой вопрос, достаточно близкий к предыдущему.Что если я хочу передать некоторую контекстную информацию из bean-компонента A в другие bean-компоненты, которые вызываются из A?Что-то вроде учетных данных безопасности и участника безопасности?Что я могу сделать?Может быть, вопросы, которые я задал, - это какая-то плохая практика?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Похоже на хороший вариант использования для , доступный в Logback и Log4J . По сути, вы присоединяете какое-то пользовательское значение к потоку, и все сообщения журнала, поступающие из этого потока, могут присоединять это значение к сообщению.

Я думаю, что лучший способ реализовать это в EJB - это перехватчик :

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");
        }
    }
}

Теперь все, что вам нужно сделать, это добавить:

%X{user}

к вашему шаблону регистрации (logback.xml или log4j.xml).

Смотри также

0 голосов
/ 21 февраля 2012

Для общего контекста вы можете использовать TransactionSynchronizationRegistry .Это может выглядеть примерно так:

@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);
        ...
    }
}

Я полагаю, что это обычно реализуется с использованием переменных ThreadLocal , поскольку обычно каждая транзакция отображается в поток потока на серверах приложений.Поэтому, если TransactionSynchronizationRegistry не реализован в вашей AS (как, например, в JBoss 4.2.3) или вам нужен инструмент более низкого уровня, вы можете напрямую использовать переменные ThreadLocal.

Кстати, я полагаю, что утилиты MDC используют то же самое под крышками.

...