java - 消息驱动 Bean 的过滤器类

标签 java spring ejb-3.0

我有如下要求:

我们的应用程序中有 20 个消息驱动的 Bean,当每个 bean 的消息到达时,我需要将该信息记录到有关消息的数据库中。我可以将它添加到每个 bean,但我需要为每个 bean 更改每个类。

有没有一种方法可以添加一些 Filter 类,这些类将在执行 MDB onMessage 方法之前触发。这样,我就可以使用一个类来记录所有 MDB 消息

最佳答案

一般来说,您应该使用一些 AOP 技术。详细地说,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) {
        //....
    }
}

示例取自 Configuring an Interceptor Class for an EJB 3.0 MDB .

要通过评论解决您的问题:您可以访问 InvocationContext在公开所有必需属性的拦截器中:

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

请注意,您甚至可以更改参数或在拦截器中使用不同的参数。

您用 标记了您的消息和 .在 Spring AOP选项更加灵活,但总体思路仍然适用。

关于java - 消息驱动 Bean 的过滤器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8908155/

相关文章:

macos - 如何在 OSX Mountain Lion 上临时禁用 JRE

java - 如何使内部 Java 包在 Eclipse 中可访问?

java - 如何调用泛型方法?

spring - Tiles Config bean 抛出异常 : TestNG+Spring 3+Tiles2

java - Spring - hibernate -org.hibernate.TransientObjectException:对象引用了一个未保存的临时实例

Spring OpenentityManagerInViewFilter 替代品

java - 在 EJB3 中处理拦截器异常的正确方法是什么?

java - Java 中的事件监听器

architecture - 是否支持 EJB3?

java - 速度模板 : how do I put the result of#springMessage() into a velocity variable