基于Apache CXF的应用程序中的长期对象

时间:2013-04-23 09:54:35

标签: java web-services tomcat cxf

我正在构建客户端 - 服务器应用程序的服务器部分,它使用Web服务相互通信,使用Apache CXF实现。

在应用程序中,我希望有一个对象,它是在部署Web应用程序时创建的,直到它被停止和/或取消部署为止。

我们称之为MyBackend backend

我还希望拥有不同的网络服务,例如http://myserver.com/service1http://myserver.com/service2

  1. 接收来自客户的请求,
  2. 将它们传递给backend对象和
  3. MyBackend方法的返回值发送回客户端。
  4. 我打算创建以下两个类,它们使用相同的MyBackend实例。

    @Path("/service1")
    public class MyWebService1 {
        private MyBackend backend = ...;
    
        @POST
        @Produces("text/plain")
      public String performOperation1(@FormParam("request") final String aRequest)
      {
        return backend.doSomething();
      }
    }
    
    
    @Path("/service2")
    public class MyWebService2 {
        private MyBackend backend = ...;
    
        @POST
        @Produces("text/plain")
      public String performOperation2(@FormParam("request") final String aRequest)
      {
        return backend.doSomethingDifferent();
      }
    }
    

    问题:

    1. 如果我实现这样的Web服务,MyBackend实例的状态是否会在不同的Web服务调用中保留(如上所述,只要应用程序在内部运行,我就需要此对象存活app容器)?
    2. 我在哪里可以创建和初始化MyBackend实例(考虑到由于与数据库的连接,初始化可以持续很长时间)?
    3. 应该在哪里找到后端对象的关闭程序(比如切断与数据库的连接)?

1 个答案:

答案 0 :(得分:2)

我强烈建议使用Spring和依赖注入来处理这个问题。您可以定义一个MyBackend bean,然后将其注入服务bean。

<bean id="myBackend" class="com.whatever.MyBackend"/>

<bean id="service1Bean" class="com.whatever.MyWebService1">
  <property name="backend" ref="myBackend"/>
</bean>

<jaxrs:server id="service1" address="/">
  <jaxrs:serviceBeans>
    <ref bean="service1Bean" />
  </jaxrs:serviceBeans>
</jaxrs:server>