spring 引导的 WebServiceTemplate 性能问题
WebServiceTemplate performance issue with spring boot
我正在使用 WebServiceTemplate 使用 soap Web 服务,它在 spring3+ 中工作良好且性能良好。
spring :- 3.2.4.RELEASE
spring-ws-core :- 2.1.4.RELEASE
spring-ws-support :- 2.1.4.RELEASE
spring-ws-security :-2.1.4.RELEASE
Class 用于调用 soap 服务
SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance());
messageFactory.afterPropertiesSet();
WebServiceTemplate webServiceTemplate = new WebServiceTemplate(messageFactory);
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("some package");
marshaller.afterPropertiesSet();
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
webServiceTemplate.afterPropertiesSet();
webServiceTemplate.setInterceptors(clientInterceptors);
webServiceTemplate.setMessageSender(webServiceMessageSenderWithAuth);
webServiceTemplate.setDefaultUri(url);
Output result= ((JAXBElement<Output >) webServiceTemplate.marshalSendAndReceive(jaxbRequest)).getValue();
配置文件
@Configuration
public class WebServiceConfiguration {
@Autowired
private SaajSoapMessageFactory messageFactory;
@Autowired
private WebServiceMessageSenderWithAuth webServiceMessageSenderWithAuth;
@Bean
public Wss4jSecurityInterceptor getWss4jSecurityInterceptor(@Value("${WSDL.UserName}") String userName,
@Value("${WSDL.Password}") String password) {
Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
wss4jSecurityInterceptor.setSecurementUsername(userName);
wss4jSecurityInterceptor.setSecurementPassword(password);
return wss4jSecurityInterceptor;
}
@Bean
public SaajSoapMessageFactory getSaajSoapMessageFactory() {
return new SaajSoapMessageFactory();
}
@Bean
public ClientInterceptor[] clientInterceptors(Wss4jSecurityInterceptor wsSecurityInterceptor) {
return new ClientInterceptor[] { wsSecurityInterceptor };
}
}
演出结果
计时——大约 500 毫秒 平均时间,最长时间:- 1 秒
Spring 启动 1.5.20.RELEASE 和 2.2.2.RELEASE
使用 spring 启动相同的代码而无需任何更改,第一次调用大约需要 4 秒,如果继续点击相同的代码,则
大约需要 2 秒
使用 spring 引导的性能结果
第一次通话:- 4 秒
无间隔的后续调用(1-10 秒间隔):- 2 秒 到 800 毫秒
它不断减少,同时以更短的间隔一次又一次地打同一个电话,然后下降到 spring mvc 3 之类的结果,但如果在 5 分钟等间隔后再次尝试,则再次遵循相同的模式
如果在 5 分钟后再次尝试,则第一次和以后的调用结果相同。
注意:- 使用 spring 引导我也尝试了 wss4j 而不是 wss4j2
还尝试了 AxiomSoapMessageFactory 但没有成功
- 我试过连接保持活动等等,但仍然没有成功
Caching could be one of the factors for the results above
缓存 是一种增强系统性能的机制。它是位于应用程序和持久数据库之间的临时内存。 Cache memory 存储最近使用的数据项,以尽可能减少数据库命中数。
JVM warm-up effect
启动基于 JVM 的应用程序时,它收到的第一个请求通常比平均响应时间慢得多。这 warm-up effect 通常是由于 class 加载和启动时的字节码解释。
要进一步优化应用程序,请使用 Hypersistence Optimizer,它允许您通过扫描应用程序配置和映射来充分利用 JPA 和 Spring 引导.
运行 Hypersitence Optimizer 非常简单,因为您只需将 EntityManagerFactory
实例传递给 HypersistenceOptimizer
对象构造函数,然后调用 init 方法
我想您已经这样做了,但如果您还没有,请查看 Faster StartUp 并实施那里建议的修复。
对于禁用嵌入式扫描tomcat,这里的评论中有一个建议Tomcat JarScanning
Enable Asynchronous Calls in a SpringBootApplication
@EnableSync
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
所以问题不在于代码。我终于将它部署在 jboss Wildfly and bang..
无需更改任何一行,它就开始表现得非常好。
现在大约需要 300 毫秒 到 500 毫秒。所以问题出在嵌入式 tomcat 和嵌入式码头不好
我正在使用 WebServiceTemplate 使用 soap Web 服务,它在 spring3+ 中工作良好且性能良好。
spring :- 3.2.4.RELEASE
spring-ws-core :- 2.1.4.RELEASE
spring-ws-support :- 2.1.4.RELEASE
spring-ws-security :-2.1.4.RELEASE
Class 用于调用 soap 服务
SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance());
messageFactory.afterPropertiesSet();
WebServiceTemplate webServiceTemplate = new WebServiceTemplate(messageFactory);
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("some package");
marshaller.afterPropertiesSet();
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
webServiceTemplate.afterPropertiesSet();
webServiceTemplate.setInterceptors(clientInterceptors);
webServiceTemplate.setMessageSender(webServiceMessageSenderWithAuth);
webServiceTemplate.setDefaultUri(url);
Output result= ((JAXBElement<Output >) webServiceTemplate.marshalSendAndReceive(jaxbRequest)).getValue();
配置文件
@Configuration
public class WebServiceConfiguration {
@Autowired
private SaajSoapMessageFactory messageFactory;
@Autowired
private WebServiceMessageSenderWithAuth webServiceMessageSenderWithAuth;
@Bean
public Wss4jSecurityInterceptor getWss4jSecurityInterceptor(@Value("${WSDL.UserName}") String userName,
@Value("${WSDL.Password}") String password) {
Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
wss4jSecurityInterceptor.setSecurementUsername(userName);
wss4jSecurityInterceptor.setSecurementPassword(password);
return wss4jSecurityInterceptor;
}
@Bean
public SaajSoapMessageFactory getSaajSoapMessageFactory() {
return new SaajSoapMessageFactory();
}
@Bean
public ClientInterceptor[] clientInterceptors(Wss4jSecurityInterceptor wsSecurityInterceptor) {
return new ClientInterceptor[] { wsSecurityInterceptor };
}
}
演出结果 计时——大约 500 毫秒 平均时间,最长时间:- 1 秒
Spring 启动 1.5.20.RELEASE 和 2.2.2.RELEASE
使用 spring 启动相同的代码而无需任何更改,第一次调用大约需要 4 秒,如果继续点击相同的代码,则
大约需要 2 秒使用 spring 引导的性能结果
第一次通话:- 4 秒
无间隔的后续调用(1-10 秒间隔):- 2 秒 到 800 毫秒
它不断减少,同时以更短的间隔一次又一次地打同一个电话,然后下降到 spring mvc 3 之类的结果,但如果在 5 分钟等间隔后再次尝试,则再次遵循相同的模式 如果在 5 分钟后再次尝试,则第一次和以后的调用结果相同。
注意:- 使用 spring 引导我也尝试了 wss4j 而不是 wss4j2 还尝试了 AxiomSoapMessageFactory 但没有成功
- 我试过连接保持活动等等,但仍然没有成功
Caching could be one of the factors for the results above
缓存 是一种增强系统性能的机制。它是位于应用程序和持久数据库之间的临时内存。 Cache memory 存储最近使用的数据项,以尽可能减少数据库命中数。
JVM warm-up effect
启动基于 JVM 的应用程序时,它收到的第一个请求通常比平均响应时间慢得多。这 warm-up effect 通常是由于 class 加载和启动时的字节码解释。
要进一步优化应用程序,请使用 Hypersistence Optimizer,它允许您通过扫描应用程序配置和映射来充分利用 JPA 和 Spring 引导.
运行 Hypersitence Optimizer 非常简单,因为您只需将 EntityManagerFactory
实例传递给 HypersistenceOptimizer
对象构造函数,然后调用 init 方法
我想您已经这样做了,但如果您还没有,请查看 Faster StartUp 并实施那里建议的修复。
对于禁用嵌入式扫描tomcat,这里的评论中有一个建议Tomcat JarScanning
Enable Asynchronous Calls in a SpringBootApplication
@EnableSync
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
所以问题不在于代码。我终于将它部署在 jboss Wildfly and bang.. 无需更改任何一行,它就开始表现得非常好。
现在大约需要 300 毫秒 到 500 毫秒。所以问题出在嵌入式 tomcat 和嵌入式码头不好