将数据(transactionId)传递给CXF拦截器

时间:2013-05-02 21:25:57

标签: java web-services soap cxf interceptor

我尝试构建一个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>

2 个答案:

答案 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