You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ba...@apache.org on 2008/05/15 18:24:58 UTC
svn commit: r656721 - in /webservices/axis2/trunk/java/modules:
jaxws-integration/test/org/apache/axis2/jaxws/sample/
kernel/src/org/apache/axis2/description/ kernel/src/org/apache/axis2/engine/
Author: barrettj
Date: Thu May 15 09:24:57 2008
New Revision: 656721
URL: http://svn.apache.org/viewvc?rev=656721&view=rev
Log:
Synchronous API operations over async-on-the-wire MEP do not get notified of error conditions and timeout. SyncCallBack implementation of AxisCallback
needs to be notified of onComplete() after onError(). Added test to verify behavior.
Modified:
webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/RuntimeExceptionsAsyncMepTest.java
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
Modified: webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/RuntimeExceptionsAsyncMepTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/RuntimeExceptionsAsyncMepTest.java?rev=656721&r1=656720&r2=656721&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/RuntimeExceptionsAsyncMepTest.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/RuntimeExceptionsAsyncMepTest.java Thu May 15 09:24:57 2008
@@ -18,6 +18,7 @@
*/
package org.apache.axis2.jaxws.sample;
+import java.net.ConnectException;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@@ -50,12 +51,19 @@
public class RuntimeExceptionsAsyncMepTest extends AbstractTestCase {
private static final String DOCLITWR_ASYNC_ENDPOINT = "http://localhost:6060/axis2/services/AsyncService2.DocLitWrappedPortImplPort";
-
+ private static final String CONNECT_EXCEPTION_ENDPOINT = "http://localhost:6061/axis2/services/AsyncService2.DocLitWrappedPortImplPort";
static final String CONNECT_404_ENDPOINT = DOCLITWR_ASYNC_ENDPOINT // Constants.DOCLITWR_ASYNC_ENDPOINT
+ "/DoesNotExist";
static final String HOST_NOT_FOUND_ENDPOINT = "http://this.endpoint.does.not.exist/nope";
+ /*
+ * For async-on-the-wire exchanges, we need to enable WS-Addressing and get a transport
+ * listener setup to receive the inbound request from the service-provider which contains the
+ * response. We only need to do that one time for all the tests.
+ */
+ static boolean listenerAlreadySetup = false;
+
public static Test suite() {
Test test = getTestSetup(new TestSuite(
RuntimeExceptionsAsyncMepTest.class), null,
@@ -75,6 +83,33 @@
return port;
}
+ /**
+ * @testStrategy Invoke the proxy with sync method, specifying that it should use
+ * the async-on-the-wire MEP. The proxy enpdoint specifies a port that
+ * does not exist. Verify that the connection exception is received
+ * by the client.
+ */
+
+ public void testAsyncCallback_asyncWire_ConnectException() throws Exception {
+ setupAddressingAndListener();
+
+ AsyncPort port = getPort();
+ Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
+ rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, CONNECT_EXCEPTION_ENDPOINT);
+ rc.put("org.apache.axis2.jaxws.use.async.mep", Boolean.TRUE);
+
+ try {
+ String resp = port.throwException(ExceptionTypeEnum.WSE);
+ fail("Did not get an exception as expected");
+ } catch (Exception ee) {
+ assertTrue("ExecutionException.getCause should be an instance of WebServiceException",
+ ee instanceof WebServiceException);
+ assertTrue("Didn't get a cause within the WebServiceException",
+ ee.getCause() != null);
+ assertTrue("Cause was not ConnectionException as expected",
+ ee.getCause() instanceof ConnectException);
+ }
+ }
/**
* @testStrategy Invoke the proxy with async-polling method, the proxy is
@@ -317,19 +352,7 @@
*/
public void testAsyncCallback_asyncMEP_asyncWire_Addressing_WebServiceException()
throws Exception {
-
- // we want to use addressing on the client side
- String repopath = System.getProperty("basedir", ".") + "/"
- + System.getProperty("build.repository");
- String axis2xmlpath = System.getProperty("basedir", ".")
- + "/test-resources/axis2_addressing.xml";
- FileSystemConfigurator configurator = new FileSystemConfigurator(
- repopath, axis2xmlpath);
- ClientConfigurationFactory factory = new ClientConfigurationFactory(
- configurator);
- MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class,
- factory);
-
+ setupAddressingAndListener();
AsyncPort port = getPort();
Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
@@ -395,5 +418,29 @@
return found;
}
+
+
+ /**
+ * Setup to use addressing and to start a listener to receive inbound async responses
+ * from the service-provider.
+ *
+ * @throws Exception
+ */
+ synchronized private void setupAddressingAndListener() throws Exception {
+ if (!listenerAlreadySetup) {
+ listenerAlreadySetup = true;
+ // we want to use addressing on the client side
+ String repopath = System.getProperty("basedir", ".") + "/"
+ + System.getProperty("build.repository");
+ String axis2xmlpath = System.getProperty("basedir", ".")
+ + "/test-resources/axis2_addressing.xml";
+ FileSystemConfigurator configurator = new FileSystemConfigurator(
+ repopath, axis2xmlpath);
+ ClientConfigurationFactory factory = new ClientConfigurationFactory(
+ configurator);
+ MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class,
+ factory);
+ }
+ }
}
Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java?rev=656721&r1=656720&r2=656721&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java Thu May 15 09:24:57 2008
@@ -450,7 +450,7 @@
AxisFault fault = new AxisFault(body.getFault(), response);
if (callback != null) {
callback.onError(fault);
- } else {
+ } else if (axisCallback != null) {
axisCallback.onError(fault);
}
@@ -458,7 +458,7 @@
if (callback != null) {
AsyncResult asyncResult = new AsyncResult(response);
callback.onComplete(asyncResult);
- } else {
+ } else if (axisCallback != null) {
axisCallback.onMessage(response);
}
@@ -468,13 +468,15 @@
} catch (Exception e) {
if (callback != null) {
callback.onError(e);
- } else {
+ } else if (axisCallback != null) {
axisCallback.onError(e);
}
} finally {
if (callback != null) {
callback.setComplete(true);
+ }else if (axisCallback != null) {
+ axisCallback.onComplete();
}
}
}
Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java?rev=656721&r1=656720&r2=656721&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java Thu May 15 09:24:57 2008
@@ -639,11 +639,20 @@
Object callback = ((CallbackReceiver) msgReceiver)
.lookupCallback(msgctx.getMessageID());
if (callback == null) return; // TODO: should we log this??
-
+
if (callback instanceof Callback) {
+ // Instances of Callback only expect onComplete to be called
+ // for a successful MEP. Errors are reported through the
+ // Async Response object, which the Callback implementations
+ // all use.
((Callback)callback).onError(e);
} else {
+ // The AxisCallback (which is OutInAxisOperationClient$SyncCallBack
+ // used to support async-on-the-wire under a synchronous API
+ // operation) need to be told the MEP is complete after being told
+ // of the error.
((AxisCallback)callback).onError(e);
+ ((AxisCallback)callback).onComplete();
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org