我尝试构建一个UI来查看从我的应用程序发出的SOAP事务。
典型的情况是每个用户事务包括对多个系统的多个Web服务请求,我正在为该用户事务生成transactionId并在日志文件中使用该transactionId记录所有日志,以便可以搜索日志文件使用transactionId和相应的日志语句可以在UI上显示。
因此,我能够将生成的transactionId附加到所有日志语句,并能够从日志文件中提取它们。
但问题是,对于SOAP请求,我无法找到在SOAP请求的日志文件中添加相同transactionId的方法。
有人可以给我一些指示我如何将生成的transactionId传递给CXF拦截器(或自定义CXF拦截器),这样当CXF记录SOAP请求并重新发送时,它将附加传递的transactionId。
喜欢这个
INFO: Outbound Message
---------------------------
transactionId=1234ABCXXX
ID: 1
Address: http://localhost:8080/Zservice/get?wsdl
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:get xmlns:ns2="http://service.zservice.com/"><arg0/></ns2:get></soap:Body></soap:Envelope>
答案 0 :(得分:3)
我终于能够使用MDC
激活它了在您调用Web服务客户端的Web服务适配器中,在MDC中设置事务ID,如下所示。
MDC.put("transaction", transId);
Account acct= new Account();
//Set the requrest
//invoke WS client
client.get(acct);
在自定义拦截器中,检索事务ID
public void handleMessage(SoapMessage message) {
String transaction = MDC.get("transaction");
logger.info("Transaction ID: {} ", transaction);
try {
LogInUtil.logging(logger, message, transaction);
}
catch (Exception ex) {
logger.warn("Unable to save SOAP Response due to {}",ex.getMessage());
}
}
答案 1 :(得分:0)
如果您尝试为每个请求使用唯一的transaction-id以将其与请求相关联,则需要获取org.apache.cxf.message.Message
实例。它作为参数传递给handleMessage()
方法中的所有拦截器。您还可以在静态上下文中使用org.apache.cxf.phase.PhaseInterceptorChain.getCurrentMessage()
在应用程序的任何位置获取它。
然后,您可以在InInterceptor
中创建交易ID,如
Message message = PhaseInterceptorChain.getCurrentMessage();
message.put("transaction-id",UUID.randomUUID().toString());
在您记录SOAP请求/响应的代码中,您可以检索并记录它
Message message = PhaseInterceptorChain.getCurrentMessage();
String transactionId = message.get("transaction-id");
// happy logging