2013-04-23 157 views
0

我构建了一个客户机 - 服务器应用程序的服务器部分,它使用Web服务相互通信,使用Apache CXF实现。基于Apache CXF的应用程序中的长寿命对象

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

我们称之为MyBackend backend

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

  1. 接收来自客户端的请求,
  2. 它们传递到backend对象和
  3. MyBackend方法的返回值回到客户端。

我打算创建以下两个类,它们使用相同的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. 如果我实现这样的网络服务,将MyBackend实例的状态可以在不同的Web服务调用保存(如上所述,我需要这个对象是只要应用程序在应用程序容器中运行,就一直存在)?
  2. 在哪里可以创建并初始化MyBackend实例(考虑到由于连接到数据库,初始化可能会持续很长时间)?
  3. 后端对象的关闭过程应该放在哪里(如切断与数据库的连接)?

回答

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> 
+0

谢谢。你能推荐一个基于Spring的web服务的最小代码示例(最好是mavenised)吗? – 2013-04-23 10:37:15

+1

@DmitriPisarenko您已经拥有该代码,请查看http://cxf.apache.org/docs/embedding-cxf-inside-spring.html了解如何将CXF集成到Spring中。 – Qwerky 2013-04-23 12:17:01

相关问题