用于清理MDC的CXF拦截器阶段

时间:2014-11-25 18:06:58

标签: java web-services cxf slf4j logback

您是否建议Apache CXF阶段挂钩出站拦截器以清理SLF4J映射诊断上下文(MDC)?

我看到一些code available publicly on GitHub触发了Phase.PRE_STREAM的日志记录上下文清除。我的第一个想法就是在最后Phase.SETUP_ENDING调用它。

编辑:部署后,我意识到我还需要将其连接到outFaultInterceptors。要实现这一点,我必须将Phase.SETUP_ENDING更改为Phase.MARSHALL。但我不知道为什么或这是否是最好的阶段。

我是Apache CXF的新手,并希望确保我不会使用错误的阶段破坏某些内容。

这是我的代码

import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.slf4j.MDC;

public class MdcCleanUpInterceptor extends AbstractPhaseInterceptor<Message> {

    public MdcCleanUpInterceptor() {
        super(Phase.MARSHAL);
    }

    @Override
    public void handleMessage(Message message) {
        MDC.clear();
    }
}

和我的Spring定义

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xmlns:cxf="http://cxf.apache.org/core"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
            http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
    <cxf:bus>
        <cxf:outInterceptors>
            <ref bean="mdcCleanUpInterceptor"/>
        </cxf:outInterceptors>
        <cxf:outFaultInterceptors>
            <ref bean="mdcCleanUpInterceptor"/>
        </cxf:outFaultInterceptors>
    </cxf:bus>

    <bean id="mdcCleanUpInterceptor" class="MdcCleanUpInterceptor"/>
</beans>

1 个答案:

答案 0 :(得分:2)

我和POST_MARSHALL一起去了。这样,当输出经过马歇尔阶段时,MDC仍处于上下文中,并且它仍然可以作为outFaultInterceptor