Sel*_*wyn 6 spring-rabbit spring-amqp
问题:我正在从MessageListener接口impl迁移到@RabbitListener。我有这样的逻辑,我在被多个类继承的MessageListener上进行“前置”和“后置”消息处理
例:
public AbstractMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
//do some pre message processing
process(Message message);
// do some post message processing
}
protected abstract void process(Message message);
}
Run Code Online (Sandbox Code Playgroud)
问题:有没有一种方法可以使用@RabbitListener批注实现类似的功能,在其中我可以继承前/后消息处理逻辑,而不必在每个子@RabbitListener批注内重新实现或调用前/后消息处理,并且始终保持子@RabbitListener的可自定义方法签名?还是这太贪心?
预期结果示例:
public class SomeRabbitListenerClass {
@RabbitListener( id = "listener.mypojo",queues = "${rabbitmq.some.queue}")
public void listen(@Valid MyPojo myPojo) {
//...
}
}
public class SomeOtherRabbitListenerClass {
@RabbitListener(id = "listener.orders",queues ="${rabbitmq.some.other.queue}")
public void listen(Order order, @Header("order_type") String orderType) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
这两个@RabbitListener都使用相同的继承的前后消息处理
我看到@RabbitListener批注中有一个'containerFactory'参数,但是我已经在配置中声明了一个...我真的确定如何通过自定义containerFactory实现我想要的继承。
更新答案:这就是我最终要做的。
建议定义:
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.amqp.core.Message;
/**
* AOP Around advice wrapper. Every time a message comes in we can do
* pre/post processing by using this advice by implementing the before/after methods.
* @author sjacobs
*
*/
public class RabbitListenerAroundAdvice implements MethodInterceptor {
/**
* place the "AroundAdvice" around each new message being processed.
*/
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Message message = (Message) invocation.getArguments()[1];
before(message)
Object result = invocation.proceed();
after(message);
return result;
}
Run Code Online (Sandbox Code Playgroud)
声明bean:在您的Rabbitmq配置中将建议声明为Spring bean,并将其传递给RabbitListenerContainerFactory#setAdviceChain(...)
//...
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory( cachingConnectionFactory() );
factory.setTaskExecutor(threadPoolTaskExecutor());
factory.setMessageConverter(jackson2JsonMessageConverter());
factory.setAdviceChain(rabbitListenerAroundAdvice());
return factory;
}
@Bean
public RabbitListenerAroundAdvice rabbitListenerAroundAdvice() {
return new RabbitListenerAroundAdvice();
}
// ...
Run Code Online (Sandbox Code Playgroud)
更正
您可以使用SimpleRabbitListenerContainerFactory 中的建议链将周围建议应用于为以下对象创建的侦听器@RabbitListener;两个参数是Channel和Message。
如果您只需要在调用侦听器之前采取行动,则可以将MessagePostProcessor(s)添加到容器中afterReceivePostProcessors。
| 归档时间: |
|
| 查看次数: |
4245 次 |
| 最近记录: |