0

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

2 回答 2

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());
        }
}
于 2013-05-06T13:55:18.887 回答
0

如果您尝试为每个请求使用唯一的 transaction-id 以便将其与请求相关联,则需要获取org.apache.cxf.message.Message实例。它作为参数传递给handleMessage()方法中的所有拦截器。您还可以org.apache.cxf.phase.PhaseInterceptorChain.getCurrentMessage()在静态上下文中使用以在应用程序的任何位置获取它。

然后,您可以在中创建事务 ID,InInterceptor如下所示

Message message = PhaseInterceptorChain.getCurrentMessage();
message.put("transaction-id",UUID.randomUUID().toString());

在您记录 SOAP 请求/响应的代码中,您可以检索并记录它

Message message = PhaseInterceptorChain.getCurrentMessage();
String transactionId = message.get("transaction-id");
// happy logging
于 2013-05-06T01:18:49.690 回答