2013-04-23 155 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

相關問題