Spring Boot Sping Boot 的WebServiceTemplate性能问题

n3schb8v  于 2023-04-20  发布在  Spring
关注(0)|答案(3)|浏览(123)

我正在使用WebServiceTemplate消费soap Web服务,它在spring 3+中运行良好,性能良好。

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();

配置文件

@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 ms平均时间,最大时间-1秒
Sping Boot 1.5.20.RELEASE和2.2.2.RELEASE

使用spring Boot 相同的代码没有任何更改,第一次调用大约需要4秒,如果继续点击相同的代码,则需要大约2秒。

** Spring Boot 性能结果**

首次呼叫:-4秒
无间隔的后续呼叫(1-10秒间隔):-2秒800毫秒
它继续减少,同时保持一次又一次地以更少的间隔击中相同的调用,并下降到类似于spring mvc 3的结果,但如果在5分钟等间隔后再次尝试,则再次遵循相同的模式如果在5分钟后再次尝试,则第一次和以后的调用结果相同。

注意:-在spring Boot 中,我也尝试了wss 4j而不是wss 4j 2还尝试了AxiomSoapMessageFactory但没有成功

  • 我已经尝试连接保持活跃等,但仍然没有运气
ajsxfq5m

ajsxfq5m1#

缓存可能是导致上述结果的因素之一

Caching是一种提升系统性能的机制,是应用程序和持久化数据库之间的临时内存,Cache memory存储最近使用过的数据项,目的是尽可能减少数据库的命中次数。

JVM预热效果
当基于JVM的应用程序启动时,它收到的第一个请求通常比平均响应时间慢得多。这种warm-up effect通常是由于启动时的类加载和字节码解释。
要进一步优化应用,请使用Hypersistency Optimizer,通过扫描应用配置和Map,充分利用JPA和Sping Boot 。
运行Hypersistence Optimizer非常简单,因为您只需将EntityManagerFactory示例传递给HypersistenceOptimizer对象构造函数,然后调用init方法
我想你已经做了,但是如果你还没有,看看Faster StartUp并实现那里建议的修复。
对于禁用嵌入式tomcat的扫描,在Tomcat JarScanning的评论中有一个建议
在SpringBootApplication中启用异步调用

@EnableSync
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
cbjzeqam

cbjzeqam2#

所以问题不在于代码。我最终在jboss Wildfly上部署了它,然后砰的一声…它就开始表现得很好,没有一行更改。
现在它需要大约300ms500ms。所以问题是嵌入式Tomcat和嵌入式Jetty不好

8ftvxx2r

8ftvxx2r3#

这也可能与MessageSender bean的maxConnectionsPerHost参数有关。默认值为2,对于惰性端点来说非常低。您可以重写

@Bean
public HttpComponentsMessageSender messageSender() {
    HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
    messageSender.setConnectionTimeout(30000);
    messageSender.setReadTimeout(30000);
    messageSender.setMaxConnectionsPerHost("http://some-soap-url", "20");
    return messageSender;
}

相关问题