Spring SOAP 端点 - 缓存 JaxbContext
Spring SOAP Endpoint - Cache JaxbContext
我基本上按照此处的 Spring 教程编写了一个简单的 SOAP 端点:https://spring.io/guides/gs/producing-web-service/
下面是用于拦截请求的class(假设注入了存储库对象):
@Endpoint
public class SampleEndpoint {
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "SampleRequest")
public
@ResponsePayload
JAXBElement<SampleResponseType> sampleQuery(
@RequestPayload JAXBElement<SampleRequestType> request) {
ObjectFactory factory = new ObjectFactory();
SampleResponseType response = repository.query(request.getValue());
JAXBElement<SampleResponseType> jaxbResponse = factory.createSampleResponse(response);
return jaxbResponse;
}
}
服务正确执行。我 运行 关注的一个问题是性能,尤其是在解组响应方面。平均而言,将对象解组为 XML 响应需要几秒钟。有没有办法 cache/inject JaxbContext Spring 用于此过程以改进这次?
这是我用于此端点的 Web 服务配置文件。我已经尝试在 Saaj 和 Axiom 消息工厂之间交替,但没有看到太多性能变化:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public SaajSoapMessageFactory soap12MessageFactory() {
SaajSoapMessageFactory factory = new SaajSoapMessageFactory();
factory.setSoapVersion(SoapVersion.SOAP_12);
return factory;
}
@Bean
public AxiomSoapMessageFactory axiomSoapMessageFactory() {
AxiomSoapMessageFactory factory = new AxiomSoapMessageFactory();
factory.setSoapVersion(SoapVersion.SOAP_12);
factory.setPayloadCaching(false);
return factory;
}
@Bean
public ServletRegistrationBean dispatcherServlet(
ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
servlet.setMessageFactoryBeanName("soap12MessageFactory");
return new ServletRegistrationBean(servlet, "/ws/*");
}
@Bean(name = "wsdlname")
public DefaultWsdl11Definition xcpdDefaultXcpdWsdl11Definition(XsdSchema
schema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setCreateSoap11Binding(false);
wsdl11Definition.setCreateSoap12Binding(true);
wsdl11Definition.setPortTypeName("xcpdPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition
.setTargetNamespace("http://somenamespace.org/");
wsdl11Definition.setSchema(schema);
return wsdl11Definition;
}
@Bean
public XsdSchema schema() {
return new SimpleXsdSchema(
new ClassPathResource(
"schema.xsd"));
}
}
两天前我们得到了问题的解决方案。我们看到的第一个问题是 JVM 的客户端版本安装在服务器上。我安装了 JVM 的服务器构建并更改 Tomcat 以使用该实例。某些 Web 服务的性能显着提高。以前简单的请求需要 3 秒,现在需要 250 毫秒。但是,在测试我编写的 Spring 服务时,我没有看到太大的改进。
为了解决最后一个问题,我在 Tomcat 的 Java 选项中添加了以下内容:
-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true
重新启动 Tomcat 实例后,服务的响应时间现在都在一秒以下。以前的请求最多需要 30 秒才能完成。我们使用的服务器JRE如下:
http://www.oracle.com/technetwork/java/javase/downloads/server-jre8-downloads-2133154.html
我基本上按照此处的 Spring 教程编写了一个简单的 SOAP 端点:https://spring.io/guides/gs/producing-web-service/
下面是用于拦截请求的class(假设注入了存储库对象):
@Endpoint
public class SampleEndpoint {
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "SampleRequest")
public
@ResponsePayload
JAXBElement<SampleResponseType> sampleQuery(
@RequestPayload JAXBElement<SampleRequestType> request) {
ObjectFactory factory = new ObjectFactory();
SampleResponseType response = repository.query(request.getValue());
JAXBElement<SampleResponseType> jaxbResponse = factory.createSampleResponse(response);
return jaxbResponse;
}
}
服务正确执行。我 运行 关注的一个问题是性能,尤其是在解组响应方面。平均而言,将对象解组为 XML 响应需要几秒钟。有没有办法 cache/inject JaxbContext Spring 用于此过程以改进这次?
这是我用于此端点的 Web 服务配置文件。我已经尝试在 Saaj 和 Axiom 消息工厂之间交替,但没有看到太多性能变化:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public SaajSoapMessageFactory soap12MessageFactory() {
SaajSoapMessageFactory factory = new SaajSoapMessageFactory();
factory.setSoapVersion(SoapVersion.SOAP_12);
return factory;
}
@Bean
public AxiomSoapMessageFactory axiomSoapMessageFactory() {
AxiomSoapMessageFactory factory = new AxiomSoapMessageFactory();
factory.setSoapVersion(SoapVersion.SOAP_12);
factory.setPayloadCaching(false);
return factory;
}
@Bean
public ServletRegistrationBean dispatcherServlet(
ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
servlet.setMessageFactoryBeanName("soap12MessageFactory");
return new ServletRegistrationBean(servlet, "/ws/*");
}
@Bean(name = "wsdlname")
public DefaultWsdl11Definition xcpdDefaultXcpdWsdl11Definition(XsdSchema
schema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setCreateSoap11Binding(false);
wsdl11Definition.setCreateSoap12Binding(true);
wsdl11Definition.setPortTypeName("xcpdPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition
.setTargetNamespace("http://somenamespace.org/");
wsdl11Definition.setSchema(schema);
return wsdl11Definition;
}
@Bean
public XsdSchema schema() {
return new SimpleXsdSchema(
new ClassPathResource(
"schema.xsd"));
}
}
两天前我们得到了问题的解决方案。我们看到的第一个问题是 JVM 的客户端版本安装在服务器上。我安装了 JVM 的服务器构建并更改 Tomcat 以使用该实例。某些 Web 服务的性能显着提高。以前简单的请求需要 3 秒,现在需要 250 毫秒。但是,在测试我编写的 Spring 服务时,我没有看到太大的改进。
为了解决最后一个问题,我在 Tomcat 的 Java 选项中添加了以下内容:
-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true
重新启动 Tomcat 实例后,服务的响应时间现在都在一秒以下。以前的请求最多需要 30 秒才能完成。我们使用的服务器JRE如下:
http://www.oracle.com/technetwork/java/javase/downloads/server-jre8-downloads-2133154.html