2009-09-30 77 views
1

我正在運行一項服務A它有一個類X。我打算在使用此類的同一臺機器上部署另一種服務BX。我怎樣才能確保相同的服務實例A被重用,而不是另一個。 PS:使用JAVA編寫的服務。如何重用Web服務的實例?

添加:這兩個服務都是Axis2服務。服務B是熱部署的。服務B使用類別X的延伸類別Y.

回答

1

難道我們試圖區分類,對象和服務。

你有這樣的事情嗎?

@javax.jws.WebService 
public class ServiceAAA{ 

    public String echo(String arg) { 
     // some really nice code here  
    } 

} 

,並要添加

@javax.jws.WebService 
public class ServiceBBB{ 
    public String superEcho(String arg) { 
     // even more code here 
     // which needs to reuse the code from A's echo()  
    } 
} 

所以很明顯,我們不希望削減和兩個實現之間粘貼。我們如何重用?

選擇1:

直接調用從B.你問如何做到這一點。它可以完成。您只需在實現中編寫JAX-WS客戶端調用。不過,我強烈建議不要這樣。服務調用可能比簡單的Java調用更昂貴。

只有在y6ou沒有選擇將兩個服務類一起部署的情況下才能執行此操作。

替代方案2:

重構實施。只需將代碼移入工人類即可。

@ javax.jws.WebService 公共類ServiceAAA {

MyWorker worker = new Worker(); 
    public String echo(String arg) { 
     return worker.doSomething(arg) ;  
    } 

} 

@ javax.jws中。WebService的 公共類ServiceBBB {

MyWorker worker = new Worker(); 
    public String superEcho(String arg) { 
     worker.doSomething(arg) ; 
     // and some morestuff    
    }  
} 
+1

謝謝你的回覆! 我想從B調用A.目標是使用相同的代碼庫和基礎結構,即 - 重新使用已經運行的實例。 – 2009-09-30 10:31:46

+0

好的,我明白了。我會稍微修改我的答案。 – djna 2009-09-30 10:37:08

0

我知道A使用類別X和B的對象。

配置你的兩個web服務A和B使用對象X. 這種配置可以通過幾種方式來完成的相同的實例,例如:在你的起始序列

  • ,創建一個實例X並通過setX(x)將其分配給每個webService。
  • 或者你可以做到這一點在構造函數中,使用靜態字段

例子:

 @javax.jws.WebService 
    public class A implements WebService { 
     public static final X x = new X(); 

     public void methodA() { 
     // use x 
     } 
    } 

    @javax.jws.WebService 
    public class B implements WebService { 
     private Y y = new Y(A.x); 

     public void methodB() { 
     // use y that uses x. 
     y.methodY(); 
     } 
    } 

    public class Y { 
     private final X x; 
     public Y(X x) { 
     this.x = x; 
     } 

     public void methodY() { 
     // use x, it is the same instance as in A 
     } 
    } 
+1

其2 - 服務A使用類X的對象 你說的啓動順序是什麼意思?這兩個服務都是Axis2服務。服務B是熱部署的。服務B使用類別X的擴展類Y. – 2009-09-30 10:07:42

+0

@Ankit「啓動序列」是您在應用程序啓動時運行的代碼。很多時候,你有這樣一個地方,你只需要執行一次代碼... – KLE 2009-09-30 10:15:28

+0

@Ankit如果Y(由B使用)是X的一個子類(由A使用),它們怎麼會是相同的實例?我不明白... – KLE 2009-09-30 10:16:27

0

不知道Java的,但你可以使用一個singleton pattern在您要使用的對象。

編輯:我想你應該有X類實現Singleton模式...