我有如下要求:
我们的应用程序中有 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];
请注意,您甚至可以更改参数或在拦截器中使用不同的参数。
您用 ejb-3.0 标记了您的消息和 spring .在 Spring AOP选项更加灵活,但总体思路仍然适用。
关于java - 消息驱动 Bean 的过滤器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8908155/