Класс фильтра для сообщений, управляемых компонентом - PullRequest
3 голосов
/ 18 января 2012

У меня есть требование, как показано ниже:

В нашем приложении имеется 20 управляемых сообщениями бинов, когда когда-либо поступало сообщение для каждого бина, мне нужно зарегистрировать эту информацию в базе данных о сообщении. Я могу добавить это к каждому бину, но мне нужно изменить каждый класс для каждого.

Есть ли способ, где мы можем добавить некоторый класс Filter, который будет запущен перед выполнением метода onBessage MDB. Таким образом, у меня может быть один класс для регистрации всех сообщений MDB .

1 Ответ

4 голосов
/ 18 января 2012

В общем, вы должны использовать некоторую технику АОП. Подробно, EJB предоставляет простой способ применения перехватчиков на MDB:

public class LoggingInterceptor {
    ...
    @AroundInvoke
    protected Object myInterceptor(InvocationContext ctx) throws Exception {
        //do logging here...
        return ctx.proceed();
    }
}

@Interceptors(LoggingInterceptor.class)
public class SomeBean implements MessageListener {
    public void onMessage(Message message) {
        //....
    }
}

Пример взят из Настройка класса перехватчика для EJB 3.0 MDB .

Чтобы ответить на ваш вопрос из комментария: у вас есть доступ к InvocationContext внутри перехватчика, который предоставляет все необходимые атрибуты:

String class = ctx.getMethod().getDeclaringClass().getName();
Message msg = (Message)ctx.getParameters()[0];

Обратите внимание, что вы даже можете изменить параметр или использовать другой в перехватчике.

Вы отметили свое сообщение с и . В Spring AOP параметры гораздо более гибкие, но общая идея по-прежнему применима.

...