【发布时间】:2017-09-01 17:58:47
【问题描述】:
我正在使用 Spring WebserviceTemplate 对服务进行 SOAP 调用。我进行了性能测试以查看它在负载下的表现。我还有一个拦截器,可以将传入请求中的标头参数复制到我正在调用的服务中。
@Component
public class HeaderPropagationInterceptor implements ClientInterceptor {
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
SoapMessage request = (SoapMessage) messageContext.getRequest();
Result result = request.getSoapHeader().getResult();
JAXB.marshal(getRequestHeader(), result);
return true;
}
当我运行性能测试时,我看到下面的语句阻塞了 4-5 秒
JAXB.marshal(getRequestHeader(), result);
这可能是阻塞的原因吗?
【问题讨论】:
-
你看到
JAXB类的javadoc了吗?它说:“一般来说,性能不一定是最佳的。预计需要编写性能关键代码的人将直接使用 JAXB API 的其余部分。” -
谢谢,但它通常会在 100 毫秒内响应。我仅在尝试加载测试时才看到此问题。这是否与我们同步导致了这种延迟?当我打开类时,我看到方法是静态但不同步
-
创建
JAXBContext通常是最耗时的部分。其余的编组/解组并没有那么慢。 -
由于最耗时的操作是创建
JAXBContext,您是否尝试通过在创建拦截器后创建JAXBContext(在@PostConstruct方法中)然后尝试更改代码编组/解组 SOAP 消息?也许在您的性能测试中,当有多个线程尝试创建上下文时,它们会产生瓶颈 -
您只需要一个
JAXBContext- @PunterVicky。它是线程安全的,正如人们所说的那样 - 实例化非常昂贵。
标签: java spring spring-boot jaxb webservicetemplate