我想将mdc上下文Map复制并设置到spring应用程序中由forkjoinpool管理的线程。不幸的是,我不能在execute方法上添加aop,因为forkjoinpool是非托管springbean。我也不能在forkjointask上应用aop。你知道如何在非bean类上应用aop吗?或者如何将mdc上下文Map复制到forkjoinpool?
@Slf4j
@Component
@Aspect
public class ForkJoinTaskAspect {
@Around("execution(* java.util.concurrent.ForkJoinPool.execute(..))")
public Object executionAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
log.debug("ForkJoinTaskAspect:: Before invoking execute() method");
Map<String, String> contextMap = MDC.getCopyOfContextMap();
Object value = null;
try {
MDC.setContextMap(contextMap);
value = proceedingJoinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
finally {
MDC.clear();
}
log.debug("ForkJoinTaskAspect:: After invoking execute() method. Return value=" + value);
return value;
}
}
1条答案
按热度按时间q5iwbnjs1#
用户r.g已经给了您正确的线索,您只能建议使用本机aspectj的类不是springbean。
在这种情况下,您的任务会更加复杂,因为您希望在引导类路径上编织成一个jre类,这在aspectj中是不容易实现的。因此,除非您想做一些相当难看的事情,比如二进制jre类编织和将编织的jre类放在引导类路径上,否则我建议您使用
call()
而不是execution()
. 这意味着您不会编织被调用方类ForkJoinPool
但是所有的呼叫类。下面是一个小例子:文件
META-INF/aop.xml
可能是:控制台日志将是: