当前位置: 首页 > 知识库问答 >
问题:

Spring SOAP endpoint - 缓存 Jaxb 上下文

邰胤
2023-03-14

我基本上按照此处找到的Spring教程编写了一个简单的 SOAP endpoint:https://spring.io/guides/gs/producing-web-service/

下面是用于拦截请求的类(假设注入了存储库对象):

@Endpoint
public class SampleEndpoint {

  @PayloadRoot(namespace = NAMESPACE_URI, localPart = "SampleRequest")
  public
  @ResponsePayload
  JAXBElement<SampleResponseType> sampleQuery(
        @RequestPayload JAXBElement<SampleRequestType> request) {

    ObjectFactory factory = new ObjectFactory();
    SampleResponseType response = repository.query(request.getValue());
    JAXBElement<SampleResponseType> jaxbResponse = factory.createSampleResponse(response);
    return jaxbResponse;

  }

}

服务运行正常。我遇到的一个问题是性能,特别是响应的解组。平均来说,将对象解组到XML响应中需要几秒钟。有没有办法缓存/注入Spring在这个过程中使用的JaxbContext来改善这种情况?

这是我用于这个endpoint的web服务配置文件。我尝试过在Saaj和Axiom消息工厂之间交替使用,但是没有看到太多的性能变化:

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {

@Bean
public SaajSoapMessageFactory soap12MessageFactory() {
    SaajSoapMessageFactory factory = new SaajSoapMessageFactory();
    factory.setSoapVersion(SoapVersion.SOAP_12);
    return factory;
}

@Bean
public AxiomSoapMessageFactory axiomSoapMessageFactory() {
    AxiomSoapMessageFactory factory = new AxiomSoapMessageFactory();
    factory.setSoapVersion(SoapVersion.SOAP_12);
    factory.setPayloadCaching(false);
    return factory;
}

@Bean
public ServletRegistrationBean dispatcherServlet(
        ApplicationContext applicationContext) {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet();
    servlet.setApplicationContext(applicationContext);
    servlet.setTransformWsdlLocations(true);
    servlet.setMessageFactoryBeanName("soap12MessageFactory");
    return new ServletRegistrationBean(servlet, "/ws/*");
}

@Bean(name = "wsdlname")
public DefaultWsdl11Definition xcpdDefaultXcpdWsdl11Definition(XsdSchema
     schema) {
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
    wsdl11Definition.setCreateSoap11Binding(false);
    wsdl11Definition.setCreateSoap12Binding(true);
    wsdl11Definition.setPortTypeName("xcpdPort");
    wsdl11Definition.setLocationUri("/ws");
    wsdl11Definition
            .setTargetNamespace("http://somenamespace.org/");
    wsdl11Definition.setSchema(schema);
    return wsdl11Definition;
}

@Bean
public XsdSchema schema() {
    return new SimpleXsdSchema(
            new ClassPathResource(
                    "schema.xsd"));
}
}

共有1个答案

孟鹏海
2023-03-14

两天前我们找到了解决这个问题的办法。我们看到的第一个问题是客户端版本的JVM安装在服务器上。我安装了JVM的服务器版本,并将Tomcat改为使用该实例。一些web服务的性能显著提高。以前简单的请求需要三秒钟,现在需要250毫秒。然而,当测试我编写的Spring服务时,我没有看到太多的改进。

为了解决最后一个问题,我在Tomcat的Java选项中添加了以下内容:

-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true

重新启动 Tomcat 实例后,服务的响应时间现在每个不到一秒。以前,请求最多需要 30 秒才能完成。我们使用的服务器 JRE 如下:

http://www.oracle.com/technetwork/java/javase/downloads/server-jre8-downloads-2133154.html

 类似资料:
  • 当我将应用程序作为独立的Java程序运行时,它运行得很好。当我将其作为applet运行时,它会通过以下堆栈跟踪抛出JAXBException。 当我添加jaxb.properties时,我收到以下错误- 我在类路径中添加了以下罐子 - 2.2.2.1 jsr311-api-1.1.1 球衣核心-1.2 泽西-客户端-1.2 导致此错误的原因。我是否缺少任何依赖项。 编辑:我在浏览器和开发环境中使用

  • 如果一次调用<code>会话。保存(customerObject)则不需要插入客户…查询数据库。Hibernate将设置id属性(“序列”或“增量”生成器),并将实体绑定到持久性上下文。当<code>事务时,持久性上下文与数据库同步。调用commit() Q:Hibernate将在哪里设置id属性 Q:在与db同步之前,持久性上下文缓存sql查询是否会插入到customer…中?我的意思是,何时生

  • 我有一个Spring应用程序,它使用MyBatis进行持久化。我使用ehcache是因为速度对于这个应用程序很重要。我已经设置并配置了MyBatis和Ehcache。我使用一个名为“mybatis”的单一缓存,因为否则为每个实体创建单独的缓存将是荒谬的。 这是我的电子缓存。xml。 这是我的mybatis映射器界面的一个示例。 因为我有一个共享缓存,所以我需要一种方法使我的密钥对域对象是唯一的。作

  • 问题内容: 有没有一种方法可以配置easy_install以避免安装失败时再次下载文件? 问题答案: pip(http://pypi.python.org/pypi/pip/)是easy_install工具的直接替代品,可以做到这一点。 只需运行并将环境变量设置为要pip存储文件的路径即可。请注意,缓存不适用于从源代码存储库(如svn / git / hg / bzr)中检出的依赖项。 然后使用代

  • 本文向大家介绍说一下 MyBatis 的一级缓存和二级缓存?相关面试题,主要包含被问及说一下 MyBatis 的一级缓存和二级缓存?时的应答技巧和注意事项,需要的朋友参考一下 一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session f

  • 问题内容: 当我调用使用 CXF 构建的特定静态服务方法时,出现以下错误,任何人都知道为什么以及如何解决它? 发生JAXBException:com.octory.ws.dto类。在此上下文中, ProfileDto 或其任何超类都不为人知。 以下是服务方法和相关的DTO: SearchResultDto: ProfileDto: 问题答案: 您的班级未在中引用。尝试添加到中。