如何重用Web服务的实例?

时间:2009-09-30 09:54:44

标签: java web-services class-design

我正在运行 A 服务,该服务有一个 X 类。我将在使用此类 X 的同一台计算机上部署另一项服务 B 。如何确保重复使用相同的服务实例 A 而不是其他服务。

PS:用JAVA编写的服务。

添加:这两项服务都是Axis2服务。服务B是热部署的。服务B使用Y类,它是X类的扩展。

3 个答案:

答案 0 :(得分: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调用A.你问的是如何做到这一点。它可以做到。您只需在您的实现中编写JAX-WS客户端调用。但是,我建议不要这样做。服务调用可能比简单的Java调用更昂贵。

如果你没有选择一起部署这两个服务类,那么只能这样做。

备选方案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 :(得分:0)

  

我知道A使用的是X类和B的对象。

配置两个webServices 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
       }
     }

答案 2 :(得分:0)

不知道java,但你可以在你试图使用的对象上使用singleton pattern

编辑:我认为你应该让类X实现单例模式...