0

我正在使用 WebServiceTemplate 使用肥皂网络服务,它在 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();

配置文件

@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 Boot 1.5.20.RELEASE 和 2.2.2.RELEASE

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

弹簧靴的性能结果

第一次通话:- 4 秒

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

它不断减少,同时以更短的间隔一次又一次地打同一个电话,并下降到类似结果的 spring mvc 3 但如果在某个间隔(如 5 分钟)后再次尝试,则再次遵循相同的模式如果在 5 分钟后尝试相同,则再次第一次和进一步调用的结果相同。

注意: - 使用 spring boot 我也尝试过wss4j而不是wss4j2 也尝试过AxiomSoapMessageFactory但没有运气

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

2 回答 2

0

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

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

JVM预热效果

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

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

运行 Hypersitence 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);
}
于 2019-12-26T02:17:52.007 回答
0

所以问题不在于代码。我终于将它部署在 jboss Wildfly 上,然后砰的一声……它刚刚开始表现得非常好,没有任何一行更改。

现在它大约需要300ms500ms。所以问题在于嵌入式tomcat和嵌入式码头不好

于 2019-12-26T12:49:04.963 回答