[英]How to pass session information to Axis2 handler
我有一个中间件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添加到传出的标头上,因此我认为是否可以从处理程序访问标头,并找到一种通过其他机制(自定义生命周期)将请求和响应消息相关联的方法,这也可以解决我的问题。 但是,我无法从处理程序中找到肥皂信封中的任何标头。 我从处理程序类中尝试了以下两种方法:
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());
}
在两种情况下,日志均不显示标题。 我也尝试过在流程中的不同阶段,而没有任何影响。 任何帮助将不胜感激
要使用MessageContext.getCurrentMessageContext获取请求标头,skeleton可以获取会话ID并将其设置为标头,并在Handler中访问相同的标头,然后将Session ID添加到响应或ur Logger MDC中(类似于Correleation ID)
在处理程序中,invoke方法的参数是响应消息上下文
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.