Service web utilisant WS-ReliableMessaging avec Axis2 et Sandesha2
Bonjour,
Je souhaite utiliser WS-ReliableMessaging pour l'appel de services web. Pour cela, j'ai ajouté le module Sandesha2 à Axis2. N'ayant pas réussi à utiliser des versions plus récentes, j'utilise Axis2 1.2 et Sandesha2 1.2, mais c'est un autre problème posé ici.
Le lien Globally Engaged Modules de la page d'administration d'Axis2 m'informe que les modules suivants sont activés :
Citation:
addressing-1.2
sandesha2-1.2
soapmonitor-1.2
J'ai tout d'abord suivi le guide utilisateur de Sandesha2. J'ai créé et déployé le service web RMSampleService comme indiqué.
Toutefois, lorsque je tente d'invoquer une opération (ping ou echoString) de ce service depuis un navigateur, je reçois une erreur 500.
Malgré cela, j'ai tout de même continué à suivre le tutorial. J'ai donc créé un répertoire de dépôt (C:\Repository) dans lequel j'ai placé les fichiers requis selon la structure indiquée. Ensuite, j'ai créé deux classes UserguidePingClient et UserguideEchoClient pour l'invocation de chacune des deux opérations (ping et echoString) exposées par le service web RMSampleService. J'ai remplacé dans chaque cas l'URL du point de terminaison du service (http://localhost:8080/axis2/services/RMSampleService) et le chemin du répertoire de dépôt (C:\Repository).
En essayant d'exécuter le client UserguidePingClient j'obtiens l'exception suivante :
Citation:
ATTENTION: Sandesha2 sender thread has not received a valid synchronous response.
java.lang.NullPointerException
at org.apache.axis2.engine.HTTPLocationBasedDispatcher.findOperation(HTTPLocationBasedDispatcher.java:51)
at org.apache.axis2.engine.AbstractDispatcher.invoke(AbstractDispatcher.java:100)
at org.apache.axis2.engine.Phase.invoke(Phase.java:383)
at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:203)
at org.apache.axis2.engine.AxisEngine.receiveFault(AxisEngine.java:354)
at org.apache.sandesha2.workers.SenderWorker.checkForSyncResponses(SenderWorker.java:653)
at org.apache.sandesha2.workers.SenderWorker.run(SenderWorker.java:341)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Unknown Source)
Et pour le client UserguideEchoClient j'obtiens par contre l'exception :
Citation:
ATTENTION: Attempt number 1 of 10 to reestalish connection listener org.apache.axis2.transport.http.server.DefaultConnectionListener@b988a6 due to failure
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at org.apache.axis2.transport.http.server.DefaultConnectionListener.run(DefaultConnectionListener.java:82)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Unknown Source)
...
GRAVE: Terminating connection listener org.apache.axis2.transport.http.server.DefaultConnectionListener@b988a6 after 10retries in 0 seconds.
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at org.apache.axis2.transport.http.server.DefaultConnectionListener.run(DefaultConnectionListener.java:82)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Unknown Source)
Enfin, si je remplace les méthodes fireAndForget du client UserguidePingClient par des méthodes sendReceive ou si je commente la ligne clientOptions.setUseSeparateListener(true); du client UserguideEchoClient je tombe cette fois-ci dans ces deux cas sur :
Citation:
GRAVE: org.apache.axis2.AxisFault: java.util.MissingResourceException: Can't find resource for bundle org.apache.axis2.i18n.ProjectResourceBundle, key spec.FAULT_ACTION_NOT_SUPPORTED_REASON
Exception in thread "main" org.apache.axis2.AxisFault: java.util.MissingResourceException: Can't find resource for bundle org.apache.axis2.i18n.ProjectResourceBundle, key spec.FAULT_ACTION_NOT_SUPPORTED_REASON
at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:434)
at org.apache.axis2.util.CallbackReceiver.receive(CallbackReceiver.java:74)
at org.apache.axis2.engine.AxisEngine.receiveFault(AxisEngine.java:363)
at org.apache.sandesha2.workers.SenderWorker.checkForSyncResponses(SenderWorker.java:653)
at org.apache.sandesha2.workers.SenderWorker.run(SenderWorker.java:341)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Unknown Source)
J'ai ensuite cherché à travailler sur le service web simple suivant :
Code:
1 2 3 4 5 6 7
| package service;
public class HelloSandesha2 {
public String sayHello(String name) {
return "Hello " + name + " !";
}
} |
Celui-ci a été correctement déployé sur le serveur Axis2 et est normalement accessible via un navigateur.
Pour accéder à ce service, j'ai créé le client suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| package axiomclient;
import java.io.File;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.client.async.AsyncResult;
import org.apache.axis2.client.async.Callback;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.sandesha2.client.SandeshaClientConstants;
public class HelloSandesha2AXIOMClient {
private static String EPR = "http://localhost:8080/axis2/services/HelloSandesha2";
private static String NS = "http://service/xsd";
private static String REPOSITORY = "C:" + File.separator + "Repository";
private static OMElement getSayHelloOMBlock(String name) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(NS, "HelloSandesha2");
OMElement method = fac.createOMElement("sayHello", omNs);
OMElement value = fac.createOMElement("name", omNs);
value.addChild(fac.createOMText(value, name));
method.addChild(value);
return method;
}
static class TestCallback extends Callback {
String name = null;
public TestCallback(String name) {
this.name = name;
}
public void onComplete(AsyncResult result) {
SOAPBody body = result.getResponseEnvelope().getBody();
OMElement echoStringResponseElem = body.getFirstChildWithName(new QName(NS, "sayHelloResponse"));
OMElement echoStringReturnElem = echoStringResponseElem.getFirstChildWithName(new QName(NS, "return"));
System.out.println(echoStringReturnElem.getText());
}
public void onError(Exception e) {
System.out.println("Error reported for test call back");
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
String axis2_xml = REPOSITORY + File.separator + "client_axis2.xml";
ConfigurationContext context = ConfigurationContextFactory.createConfigurationContextFromFileSystem(REPOSITORY, axis2_xml);
OMElement sayHelloOMBlock1 = getSayHelloOMBlock("n°1");
OMElement sayHelloOMBlock2 = getSayHelloOMBlock("n°2");
OMElement sayHelloOMBlock3 = getSayHelloOMBlock("n°3");
Options options = new Options();
options.setTo(new EndpointReference(EPR));
//options.setUseSeparateListener(true);
ServiceClient sender = new ServiceClient();//context, null);
sender.setOptions(options);
//sender.engageModule(new QName("addressing"));
//sender.engageModule(new QName("sandesha2"));
Callback callback1 = new TestCallback("Callback 1");
sender.sendReceiveNonBlocking(sayHelloOMBlock1, callback1);
Callback callback2 = new TestCallback("Callback 2");
sender.sendReceiveNonBlocking(sayHelloOMBlock2, callback2);
options.setProperty(SandeshaClientConstants.LAST_MESSAGE, "true");
Callback callback3 = new TestCallback("Callback 3");
sender.sendReceiveNonBlocking(sayHelloOMBlock3, callback3);
while(!callback3.isComplete()) {
Thread.sleep(1000);
}
} catch(AxisFault e) {
e.printStackTrace();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
} |
Commenté de la sorte, ce client n'utilise pas WS-ReliableMessaging et l'exécution renvoie bien le résultat attendu :
Citation:
21 août 2008 14:35:44 org.apache.axis2.deployment.DeploymentEngine prepareRepository
INFO: No services directory was found under C:\Repository.
21 août 2008 14:35:44 org.apache.axis2.deployment.ModuleDeployer deploy
INFO: Deploying module: addressing-1.2
21 août 2008 14:35:45 org.apache.axis2.deployment.ModuleDeployer deploy
INFO: Deploying module: sandesha2-1.2
21 août 2008 14:35:45 org.apache.axis2.deployment.ModuleDeployer deploy
INFO: Deploying module: soapmonitor-1.2
Hello n°1 !
Hello n°2 !
Hello n°3 !
Par contre, si je décommente la ligne ServiceClient sender = new ServiceClient(context, null); je retombe sur l'exception précédente :
Citation:
GRAVE: org.apache.axis2.AxisFault: java.util.MissingResourceException: Can't find resource for bundle org.apache.axis2.i18n.ProjectResourceBundle, key spec.FAULT_ACTION_NOT_SUPPORTED_REASON
Exception in thread "main" org.apache.axis2.AxisFault: java.util.MissingResourceException: Can't find resource for bundle org.apache.axis2.i18n.ProjectResourceBundle, key spec.FAULT_ACTION_NOT_SUPPORTED_REASON
at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:434)
at org.apache.axis2.util.CallbackReceiver.receive(CallbackReceiver.java:74)
at org.apache.axis2.engine.AxisEngine.receiveFault(AxisEngine.java:363)
at org.apache.sandesha2.workers.SenderWorker.checkForSyncResponses(SenderWorker.java:653)
at org.apache.sandesha2.workers.SenderWorker.run(SenderWorker.java:341)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Unknown Source)
Sans décommenter cette ligne, il est impossible d'activer les modules Addressing et Sandesha2 :
Citation:
21 août 2008 14:39:05 org.apache.axis2.deployment.DeploymentEngine prepareRepository
INFO: No services directory was found under C:\Repository.
21 août 2008 14:39:05 org.apache.axis2.deployment.ModuleDeployer deploy
INFO: Deploying module: addressing-1.2
21 août 2008 14:39:05 org.apache.axis2.deployment.ModuleDeployer deploy
INFO: Deploying module: sandesha2-1.2
21 août 2008 14:39:05 org.apache.axis2.deployment.ModuleDeployer deploy
INFO: Deploying module: soapmonitor-1.2
org.apache.axis2.AxisFault: Unable to engage module : addressing
at org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:333)
at org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:318)
at axiomclient.HelloSandesha2AXIOMClient.main(HelloSandesha2AXIOMClient.java:76)
Enfin, décommenter la ligne options.setUseSeparateListener(true); ramène à l'exception java.net.BindException: Address already in use: JVM_Bind du client UserguideEchoClient initial.
Si certains d'entre vous ont des explications, des conseils ou même des pistes à me fournir pour utiliser WS-ReliableMessaging avec Axis2, je suis preneur...
Merci à vous.
PS : Je teste cet autre tutorial pour voir ce que ça donne...