如何将会话信息传递给Axis2处理程序

时间:2014-04-18 20:24:05

标签: java session handler axis2 mdc

我有一个中间件java spring应用程序,它在顶层发布服务,并在底层使用Axis 2客户端进行服务消费。在服务层上发出请求时,会使用MDC(log4j 1.x)将会话ID添加到线程上下文中。

我们从服务层(顶层)和集成层(底层)的所有日志记录都使用MDC输出会话ID,以便可以关联这些日志。

困难在于我还需要为axis2客户端输出请求和响应xml。我创建了以下处理程序来完成此任务:

public class AxisXmlLoggerHandler extends AbstractHandler {
  static Logger log = LoggerFactory.getLogger("xmlLogger");

  @Override
  public InvocationResponse invoke(MessageContext mc) throws AxisFault {
    log.info(mc.getEnvelope().toString());

    return InvocationResponse.CONTINUE;
  }
}

还将此添加到InFlow,InFaultFlow,OutFlow,OutFaultFlow中的axis2.xml

<handler name="XMLLoggerDispatcher" class="com.xxx.xxx.logging.AxisXmlLoggerHandler"/>

这非常适合记录xml,但是会话ID不在MDC中,我假设因为MDC被复制到子线程并且处理程序是从不同的池执行的。

所以我面临的问题是,如何将MDC放到处理程序线程上?

虽然我真正需要的是会话ID,但也许还有其他选择。例如,我们在传出头上添加会话ID,所以我想如果我可以从处理程序访问头,并找到一种方法通过其他一些机制(自定义生命周期)关联请求和响应消息,这也将解决我的问题。但是,我无法从处理程序中找到soap信封中的任何标题。我在处理程序类中尝试了以下两种方式:

Iterator<SOAPHeader> hi = mc.getEnvelope().getHeader().examineAllHeaderBlocks();
if (!hi.hasNext()) log.info("no headers using examineAllHeaderBlocks");
while (hi.hasNext()) {
  SOAPHeader header = hi.next();
  log.info("header: "+header.getLocalName()+"   "+header.getText()+"   string: "+header.toString());
}

Iterator<OMElement> i = (Iterator<OMElement>) mc.getEnvelope().getHeader().getChildElements();
if (!i.hasNext()) log.info("no headers using getChildElements");
while (i.hasNext()) {
  OMElement test = i.next();
  log.info("header child: "+test.getText());
}

在这两种情况下,日志都没有显示标题。我也尝试过流向流程中的不同阶段而没有任何影响。任何帮助都会非常适合

1 个答案:

答案 0 :(得分:0)

要获取请求标头,请使用MessageContext.getCurrentMessageContext,skeleton可以获取会话ID并将其设置为标头并在Handler中访问相同的标头,并将会话ID添加到您的响应或您的Logger MDC中(类似于Correleation ID)

在invoke方法的handler参数中是响应消息上下文

   invoke(MessageContext msgContext) - This is response message context

    MessageContext reqMsgCtx = MessageContext.getCurrentMessageContext(); - This gives    request message context
    //Get header with following code
    SOAPEnvelope env = reqMsgCtx.getEnvelope();
    SOAPHeader aSoapHeader = env.getHeader();
   //Your code to add the headerblocks to response message header