javax.xml.ws.handler over Spring Webflux中的Trace信息

问题描述 投票:0回答:0

我有一个 Spring Webflux 微服务,它没有将 traceId 和 spanId 放在特定的日志跟踪中。我的应用程序使用 SOAPHandler 来记录 SOAP 请求/响应。在此跟踪中,未显示 spanId 和 traceId:

15:09:37.260 [reactor-http-nio-5] [traceId:29ad9678dfdec535 spanId:29ad9678dfdec535] DEBUG c.b.c.a.i.s.a.AvailabilityServiceImpl - Find  By Filter with HotelAvailabilityFilter HotelAvailabilityFilter(hotelId=7345, startDate=2023-08-10, endDate=2023-08-12, adults=[2], children=[0], childrenAges=null, market=USA, coupons=null, membership=false, device=desktop, groupCode=null)
15:09:37.262 [reactor-http-nio-5] [traceId:29ad9678dfdec535 spanId:29ad9678dfdec535] DEBUG c.b.c.a.i.s.a.c.ChannelConnectClient - Check Availability with HotelAvailabilityFilter HotelAvailabilityFilter(hotelId=7345, startDate=2023-08-10, endDate=2023-08-12, adults=[2], children=[0], childrenAges=null, market=USA, coupons=null, membership=false, device=desktop, groupCode=null)
15:09:37.310 [reactor-http-nio-5] [traceId:29ad9678dfdec535 spanId:29ad9678dfdec535] DEBUG o.s.w.r.f.client.ExchangeFunctions - [4c4697e0] Cancel signal (to close connection)
15:09:37.601 [jaxws-engine-1-thread-1] [traceId: spanId:] DEBUG c.b.c.f.c.s.a.SoapMessageLogger - <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:env="http://www.w3.org/2003/05/soap-envelope">
  <S:Header>...

处理程序拦截在我执行请求时启动的 SOAP 消息。要在 Webflux 中执行此操作,我使用下一个代码:

public Mono<...> checkAvailability() {
    return Mono.<OTAHotelAvailRS>create(
        sink -> ota2004AServiceSoap.checkAvailabilityAsync(otaHotelAvailRQ, into(sink)))
}

private <T> AsyncHandler<T> into(MonoSink<T> sink) {
    return res -> {
        try {
            sink.success(res.get(1, TimeUnit.MILLISECONDS));
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            sink.error(e);
        }
    };
}

ota2004AServiceSoap 是由 org.codehaus.mojo:jaxws-maven-plugin:

自动生成的 SOAP 客户端
@WebService(name = "Ota2004AServiceSoap", targetNamespace = "http://synxis.com/OTA2004AService/")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
    ObjectFactory.class
})
@Generated(value = "com.sun.tools.ws.wscompile.WsimportTool", date = "2023-03-01T12:02:37+01:00", comments = "JAX-WS RI 2.3.2")
public interface Ota2004AServiceSoap {
    @WebMethod(operationName = "CheckAvailability", action="http://synxis.com/OTA2004AService/CheckAvailability")
    public Future<?> checkAvailabilityAsync(
        @WebParam(name = "OTA_HotelAvailRQ", targetNamespace = "http://www.opentravel.org/OTA/2003/05", partName = "OTA_HotelAvailRQ")
        OTAHotelAvailRQ otaHotelAvailRQ,
        @WebParam(name = "CheckAvailabilityResponse", targetNamespace = "", partName = "asyncHandler")
        AsyncHandler<OTAHotelAvailRS> asyncHandler);

SOAPHandler,例如,可以是:

@Slf4j
public class SoapMessageLogger implements SOAPHandler<SOAPMessageContext> {
    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        log.info("example");
    }
}

我尝试在 Handler 中获取跟踪上下文,但不包含 spanId 和 traceId 信息。 我希望我在 Mono 函数中拥有的 spanId 和 traceId 被传播到 SOAPHandler。

java soap spring-webflux trace
© www.soinside.com 2019 - 2024. All rights reserved.