JAXB.marshal 阻止网络服务调用
JAXB.marshal blocking webservice call
我正在使用 Spring WebserviceTemplate 对服务进行 SOAP 调用。我 运行 性能测试以查看它在负载下的表现。我还有一个拦截器,用于将传入请求中的 header 参数复制到我正在调用的服务中。
@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 实用程序 class 将在第一次调用时创建 JAXBContext(昂贵的操作)。它将被弱缓存,这意味着如果内存不足,上下文可能会被回收,并在接下来的调用中重新创建。你真的应该创建你的上下文并明确保留它。像这样的东西(正如其他人的评论中已经建议的那样)应该可以解决你的问题:
@Component
public class HeaderPropagationInterceptor implements ClientInterceptor
{
private JAXBContext jaxbContext;
@PostConstruct
public void createJaxbContext() {
try {
jaxbContext = JAXBContext.newInstance(RequestHeader.class);
}
catch(JAXBException e) {
throw new IllegalStateException("Unable to create JAXBContext.", e);
}
}
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
SoapMessage request = (SoapMessage) messageContext.getRequest();
Result result = request.getSoapHeader().getResult();
jaxbContext.createMarshaller().marshal(getRequestHeader(), result);
return true;
}
}
您必须将 RequestHeader.class
替换为您的代码实际使用的 class。如果性能需要进一步提高,也可以使用局部线程来重用编组器,但您可能应该做进一步的分析以验证这确实是一个瓶颈。祝你的项目好运!
我正在使用 Spring WebserviceTemplate 对服务进行 SOAP 调用。我 运行 性能测试以查看它在负载下的表现。我还有一个拦截器,用于将传入请求中的 header 参数复制到我正在调用的服务中。
@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 实用程序 class 将在第一次调用时创建 JAXBContext(昂贵的操作)。它将被弱缓存,这意味着如果内存不足,上下文可能会被回收,并在接下来的调用中重新创建。你真的应该创建你的上下文并明确保留它。像这样的东西(正如其他人的评论中已经建议的那样)应该可以解决你的问题:
@Component
public class HeaderPropagationInterceptor implements ClientInterceptor
{
private JAXBContext jaxbContext;
@PostConstruct
public void createJaxbContext() {
try {
jaxbContext = JAXBContext.newInstance(RequestHeader.class);
}
catch(JAXBException e) {
throw new IllegalStateException("Unable to create JAXBContext.", e);
}
}
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
SoapMessage request = (SoapMessage) messageContext.getRequest();
Result result = request.getSoapHeader().getResult();
jaxbContext.createMarshaller().marshal(getRequestHeader(), result);
return true;
}
}
您必须将 RequestHeader.class
替换为您的代码实际使用的 class。如果性能需要进一步提高,也可以使用局部线程来重用编组器,但您可能应该做进一步的分析以验证这确实是一个瓶颈。祝你的项目好运!