MarshallingWebServiceOutboundGateway 对第一个请求占用太多

MarshallingWebServiceOutboundGateway takes too much for the first request

我们有 很多 个我们用来连接的 soap 服务,每次第一个连接到同一个服务都需要很长时间才能从集成中启动,并且后续请求正在快速削减减少 60% 的响应时间。

分析 JAXB 绑定初始化

@Configuration
public interface WSCommons {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    @Bean
      static Jaxb2Marshaller jaxb2Marshaller() {
            marshaller.setPackagesToScan("com.abc");
        return marshaller;
      }
}

第一个请求扫描所有内容并创建编组器需要大量时间。

但是,

Bean 初始化后,它可以快速处理少量请求。当服务流空闲一段时间并且请求再次开始流动时,MarshallingWebServiceOutboundGateway 非常滞后。

Jaxb2Marshaller 是静态的,在这种情况下它应该停止以重新初始化。

感谢任何输入,可能在初始化时做错了。

谢谢

我认为它不会与界面上的 @Configuration 一起使用。因此,Jaxb2Marshaller@Bean 不可见。

您需要考虑将 @Configuration 作为 class 并从 bean 定义中删除 static

Jaxb2Marshaller 有如下选项:

/**
 * Set whether to lazily initialize the {@link JAXBContext} for this marshaller.
 * Default is {@code false} to initialize on startup; can be switched to {@code true}.
 * <p>Early initialization just applies if {@link #afterPropertiesSet()} is called.
 */
public void setLazyInit(boolean lazyInit) {

默认情况下是 false,因此在正常的 bean 初始化阶段调用 afterPropertiesSet()。在这里扫描所有包,并在 Jaxb2Marshaller bean 中缓存一个完整的 JAXBContext