我有一个spring-boot对我实施的Web应用程序MDCFilter,增加了一个UUID以MDC伐木情况下,我可以在日志文件中找到。
spring-boot
MDCFilter
UUID
MDC
本Filter类看起来是这样的。
Filter
public class MDCFilter implements Filter { @Override public void init(FilterConfig filterConfig) { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { String requestId = UUID.randomUUID().toString(); MDC.put(REQUEST_ID_KEY, requestId); response.addHeader("trace", requestId); try { chain.doFilter(req, resp); } finally { MDC.remove("trace"); } } @Override public void destroy() { } }
但是最近,我们转向通过队列来处理流量,我从文档中不知道要为消息侦听器复制此过滤器行为。
我的听众看起来像这样。
@RabbitListener(queues = "${queue1}") public void receiveMessages(Message message) { doTheBusinessLogic(message) }
谁能指出我正确的方向?
使用容器的adviceChain。假设您正在使用Boot 2.0和简单的容器工厂,请覆盖boot的工厂以添加建议…
adviceChain
@SpringBootApplication public class So49770881Application { public static void main(String[] args) { SpringApplication.run(So49770881Application.class, args); } @Bean(name = "rabbitListenerContainerFactory") public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setAdviceChain(new MDCAdvice()); return factory; } public static class MDCAdvice implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { // pre process try { return invocation.proceed(); } finally { // post process } } } }