Spring boot spring引导出现WebServiceTemplate性能问题

Spring boot spring引导出现WebServiceTemplate性能问题,spring-boot,spring-3,webservicetemplate,spring-boot-2,Spring Boot,Spring 3,Webservicetemplate,Spring Boot 2,我正在使用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 调用soap服务的类 SaajSoapMessageFactory messageFactory = new SaajSoapMes

我正在使用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
调用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();
绩效结果 计时--大约500毫秒平均时间,最长时间:-1秒

弹簧护套1.5.20.释放和2.2.2.释放

使用spring boot时,相同的代码在没有任何更改的情况下第一次调用大约需要4秒,如果继续调用相同的代码,则第一次调用大约需要2秒

弹簧靴的性能结果

第一次呼叫:-4秒

无间隔的后续呼叫(间隔1-10秒):-2秒800毫秒

它不断减少,同时以较少的间隔不断地重复相同的调用,并下降到类似spring mvc 3的结果,但如果在某个间隔(如5分钟)后再次尝试,则再次遵循相同的模式 如果在5分钟后再次尝试相同的方法,则第一次和以后的呼叫的结果相同

注意:-使用弹簧靴,我也尝试了wss4j,而不是wss4j2 也尝试了工厂但运气不佳

  • 我试过保持联系等,但还是没有运气
缓存可能是上述结果的因素之一

缓存是一种提高系统性能的机制。它是一个临时内存,位于应用程序和持久数据库之间。存储最近使用的数据项,以尽可能减少数据库命中数

预热效应

启动基于JVM的应用程序时,它收到的第一个请求通常比平均响应时间慢得多。这通常是由于类加载和启动时的字节码解释

要进一步优化应用程序,请使用Hypersistence Optimizer,它允许您通过扫描应用程序配置和映射来充分利用JPA和Spring引导

运行HyperSiteOptimizer非常简单,因为您只需将
EntityManagerFactory
实例传递给
HyperSiteOptimizer
对象构造函数,然后调用init方法

我想您已经这样做了,但是如果您还没有,请查看并实施那里建议的修复

对于使用嵌入式tomcat禁用扫描,这里的评论中有一个建议

在SpringBootApplication中启用异步调用


所以问题不在于代码。我最终在jboss Wildfly和bang上部署了它。。 它刚开始表现得非常好,没有一行变化

现在大约需要300毫秒到500毫秒。因此,嵌入式tomcat和嵌入式jetty的问题不太好

,因为在不首先预热JVM的情况下测量第一次调用延迟是没有意义的。
@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 };
    }
}
@EnableSync
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}