2009-09-30 3 views
1

Je cours un service Un qui a une classe X. Je vais déployer un autre service B sur la même machine qui utilise cette classe X. Comment puis-je m'assurer que la même instance de service A est réutilisée au lieu d'une autre.Comment puis-je réutiliser une instance d'un service Web?

PS: Service écrit en JAVA. Ajout: Ces deux services sont des services Axis2. Le service B est déployé à chaud. Le service B a utilisé la classe Y qui est l'extension de la classe X.

Répondre

1

ce que nous pourrions essayer de distinguer les classes, objets et services.

Vous avez quelque chose comme ça?

@javax.jws.WebService 
public class ServiceAAA{ 

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

} 

et que vous voulez ajouter

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

Il est donc clair que nous ne voulons pas couper et coller entre les deux implémentations. Comment réutilisons-nous?

Alternative 1:

appeler directement A de B. Vous demandez comment faire. Cela pourrait être fait. Vous devez simplement coder un appel client JAX-WS dans votre implémentation. Cependant, je recommande vivement contre cela. Un appel de service est susceptible d'être plus coûteux qu'un simple appel Java.

Ne le faites que si vous n'avez pas la possibilité de déployer les deux classes de service ensemble.

Alternative 2:

Réorganisez l'implémentation. Il suffit de déplacer le code dans une classe de travailleurs.

@ javax.jws.WebService ServiceAAA public class {

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

} 

@ javax.jws.WebService ServiceBBB public class {

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

Merci d'avoir répondu! Je veux appeler A à partir de B. L'objectif ici est d'utiliser la même base de code et l'infrastructure i.e - Réutiliser l'instance en cours d'exécution. –

+0

OK, je comprends maintenant. Je vais modifier légèrement ma réponse. – djna

0

Je comprends que A utilise un objet de classe X, et B aussi.

Configurez vos deux webServices A et B d'utiliser la même instance d'objet X. Cette configuration peut se faire par plusieurs moyens, par exemple:

  • dans votre séquence de démarrage, créez une instance X et attribuez-le via setX(x) à chaque service Web.
  • ou vous pouvez le faire dans un constructeur, en utilisant des champs statiques

Exemple:

 @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

Son 2 - service A utilise objet de la classe X. Que voulez-vous dire par séquence de démarrage? Ces deux services sont des services Axis2. Le service B est déployé à chaud. Le service B a utilisé la classe Y qui est l'extension de la classe X. –

+0

@Ankit "sequence de démarrage" est un code que vous exécutez lorsque votre application démarre. Très souvent, vous avez un endroit comme celui-ci, où vous exécutez le code qui est nécessaire une seule fois ... – KLE

+0

@Ankit Si Y (utilisé par B) est une sous-classe de X (utilisée par A), comment pourraient-ils être les mêmes exemple? Je ne comprends pas ... – KLE

0

Je ne sais pas java, mais vous pouvez utiliser un singleton pattern sur les objets de votre essayez d'utiliser.

edit: Je pense que vous devriez avoir la classe X mise en œuvre du singleton ...

Questions connexes