2012-01-18 94 views
3

我有一个要求,象下面这样:过滤器类的消息驱动Bean的

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

有没有一种方法,我们可以添加将MDB onMessage方法执行前被解雇了一些过滤器类。因此,我可以有一个类记录所有MDB消息

回答

4

一般来说,你应该使用一些AOP技术。详细地说,EJB提供了一种简单的方法来对MDB的应用拦截器:从Configuring an Interceptor Class for an EJB 3.0 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) { 
     //.... 
    } 
} 

实施例。

要评论解决您的问题:你有暴露所需的所有属性的拦截器内访问InvocationContext

需要注意的是,你甚至可以改变参数,或者使用一个不同的拦截器。

你跟标记您的消息。在Spring AOP期权更为灵活,但总体思路仍然适用。

+0

我是否在这个方法myInterceptor(..)中得到正在onMessage中调用的消息?如果我有20个MDB,我怎么能识别哪个mdb被调用? – Ran 2012-01-18 10:14:13

+0

@Rana:看到我的更新,这完全有可能使用'InvocationContext'。 – 2012-01-18 10:29:00

+1

其工作。感谢Tomasz。 – Ran 2012-01-18 10:52:26