Java 如何重用Web服务的实例?

Java 如何重用Web服务的实例?,java,web-services,class-design,Java,Web Services,Class Design,我正在运行一个服务a,它有一个类X。我将在使用该类的同一台机器上部署另一个服务B。如何确保重复使用服务A的同一实例而不是另一个实例 PS:用JAVA编写的服务 添加:这两个服务都是Axis2服务。服务B是热部署的。服务B使用了类Y,它是类X的扩展 我知道A使用X类对象,B也使用X类对象 将两个Web服务A和B配置为使用对象X的同一实例。 此配置可通过多种方式完成,例如: 在开始序列中,创建一个实例X,并通过setX(X)将其分配给每个Web服务 或者,您可以在构造函数中使用静态字段执行此操作

我正在运行一个服务a,它有一个类X。我将在使用该类的同一台机器上部署另一个服务B。如何确保重复使用服务A的同一实例而不是另一个实例

PS:用JAVA编写的服务

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

我知道A使用X类对象,B也使用X类对象

将两个Web服务A和B配置为使用对象X的同一实例。 此配置可通过多种方式完成,例如:

  • 在开始序列中,创建一个实例X,并通过
    setX(X)
    将其分配给每个Web服务
  • 或者,您可以在构造函数中使用静态字段执行此操作
例如:

     @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
       }
     }
我知道A使用X类对象,B也使用X类对象

将两个Web服务A和B配置为使用对象X的同一实例。 此配置可通过多种方式完成,例如:

  • 在开始序列中,创建一个实例X,并通过
    setX(X)
    将其分配给每个Web服务
  • 或者,您可以在构造函数中使用静态字段执行此操作
例如:

     @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
       }
     }

我们可以试着区分类、对象和服务吗

你有这样的东西吗

@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 公共级服务{

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

}
@javax.jws.WebService 公共类服务BBB{

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

我们可以试着区分类、对象和服务吗

你有这样的东西吗

@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 公共级服务{

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

}
@javax.jws.WebService 公共类服务BBB{

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

我不懂java,但您可以在尝试使用的对象上使用


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

我不懂java,但是你可以在你试图使用的对象上使用a


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

它的2-服务A使用X类的对象。启动序列是什么意思?这两个服务都是Axis2服务。服务B是热部署的。服务B使用Y类,它是X类的扩展。@Ankit“启动序列”是在应用程序启动时运行的代码。通常,您会在这样的地方执行只需要一次的代码…@Ankit如果Y(由B使用)是X的子类(由a使用),它们怎么可能是同一个实例?我不明白…@KLE Y使用X的一个实例。我希望它重用现有的实例。它的2-服务A使用类X的对象。你说的启动顺序是什么意思?这两个服务都是Axis2服务。服务B是热部署的。服务B使用类Y,它是类X的扩展。@Ankit“启动序列”是在应用程序启动时运行的代码。通常,您会在这样一个地方执行只需要一次的代码…@Ankit如果Y(由B使用)是X的子类(由a使用),它们怎么可能是同一个实例?我不明白…@KLE Y使用了X的一个实例。我希望它重用现有的实例。谢谢你的回复!我想从B调用A。这里的目标是使用相同的代码库和基础结构,即重用已经运行的实例。好的,我现在明白了。我会稍微修改我的答案。谢谢你的回复plying!我想从B调用A。这里的目标是使用相同的代码库和基础结构,即重用已经运行的实例。好的,我现在明白了。我会稍微修改我的答案。