You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/06/07 16:02:32 UTC
svn commit: r1133016 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/features/clustering/
systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/failover/
systests/un...
Author: sergeyb
Date: Tue Jun 7 14:02:31 2011
New Revision: 1133016
URL: http://svn.apache.org/viewvc?rev=1133016&view=rev
Log:
[CXF-3561] Adding a test with custom conduit selector overriding Message.ENDPOINT_ADDRESS without failover
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/features/clustering/FailoverFeature.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/failover/FailoverTest.java
cxf/trunk/systests/uncategorized/src/test/java/org/apache/cxf/systest/clustering/LoadDistributorAddressOverrideTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1133016&r1=1133015&r2=1133016&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Tue Jun 7 14:02:31 2011
@@ -488,9 +488,12 @@ public abstract class AbstractClient imp
protected URI calculateNewRequestURI(Map<String, Object> reqContext) {
URI newBaseURI = URI.create(reqContext.get(Message.ENDPOINT_ADDRESS).toString());
- String baseURIPath = newBaseURI.getRawPath();
-
URI requestURI = URI.create(reqContext.get(Message.REQUEST_URI).toString());
+ return calculateNewRequestURI(newBaseURI, requestURI);
+ }
+
+ private URI calculateNewRequestURI(URI newBaseURI, URI requestURI) {
+ String baseURIPath = newBaseURI.getRawPath();
String reqURIPath = requestURI.getRawPath();
UriBuilder builder = UriBuilder.fromUri(newBaseURI);
@@ -515,7 +518,11 @@ public abstract class AbstractClient imp
(MultivaluedMap<String, String>)reqContext.get(Message.PROTOCOL_HEADERS);
URI newRequestURI = calculateNewRequestURI(reqContext);
-
+ // TODO: if failover conduit selector fails to find a failover target
+ // then it will revert to the previous endpoint; that is not very likely
+ // but possible - thus ideally we need to resert base and current URI only
+ // if we get the same ConduitInitiatior endpoint instance before and after
+ // retryInvoke.
Object response = retryInvoke(newRequestURI, headers, body, exchange, context);
exchange.put(List.class, getContentsList(response));
return new Object[]{response};
@@ -664,14 +671,23 @@ public abstract class AbstractClient imp
cfg = config;
}
- protected void prepareConduitSelector(Message message) {
+ protected void prepareConduitSelector(Message message, URI currentURI) {
try {
cfg.prepareConduitSelector(message);
+
} catch (Fault ex) {
LOG.warning("Failure to prepare a message from conduit selector");
}
message.getExchange().put(ConduitSelector.class, cfg.getConduitSelector());
message.getExchange().put(Service.class, cfg.getConduitSelector().getEndpoint().getService());
+
+ String address = (String)message.get(Message.ENDPOINT_ADDRESS);
+ // custom conduits may override the initial/current address
+ if (!address.equals(currentURI.toString())) {
+ currentURI = calculateNewRequestURI(URI.create(address), currentURI);
+ message.put(Message.ENDPOINT_ADDRESS, currentURI.toString());
+ message.put(Message.REQUEST_URI, currentURI.toString());
+ }
}
protected static PhaseInterceptorChain setupOutInterceptorChain(ClientConfiguration cfg) {
@@ -732,7 +748,7 @@ public abstract class AbstractClient imp
setContexts(m, exchange, invocationContext);
//setup conduit selector
- prepareConduitSelector(m);
+ prepareConduitSelector(m, currentURI);
return m;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/features/clustering/FailoverFeature.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/features/clustering/FailoverFeature.java?rev=1133016&r1=1133015&r2=1133016&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/features/clustering/FailoverFeature.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/features/clustering/FailoverFeature.java Tue Jun 7 14:02:31 2011
@@ -56,6 +56,10 @@ public class FailoverFeature extends org
}
}
+ public void setTargetSelector(FailoverTargetSelector selector) {
+ customSelector = selector;
+ }
+
@Override
public FailoverStrategy getStrategy() {
FailoverStrategy strategy = super.getStrategy();
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/failover/FailoverTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/failover/FailoverTest.java?rev=1133016&r1=1133015&r2=1133016&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/failover/FailoverTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/failover/FailoverTest.java Tue Jun 7 14:02:31 2011
@@ -34,6 +34,9 @@ import org.apache.cxf.jaxrs.client.JAXRS
import org.apache.cxf.jaxrs.client.ServerWebApplicationException;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.features.clustering.FailoverFeature;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.service.model.EndpointInfo;
import org.apache.cxf.systest.jaxrs.Book;
import org.apache.cxf.systest.jaxrs.BookStore;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
@@ -78,46 +81,60 @@ public class FailoverTest extends Abstra
@Test
public void testSequentialStrategy() throws Exception {
FailoverFeature feature =
- getFeature(false, Server.ADDRESS2, Server.ADDRESS3);
+ getFeature(false, false, Server.ADDRESS2, Server.ADDRESS3);
strategyTest(Server.ADDRESS1, feature, Server.ADDRESS2, null, false, false);
}
+ @Test
+ public void testSequentialStrategyWithCustomTargetSelector() throws Exception {
+ FailoverFeature feature =
+ getFeature(true, false, Server.ADDRESS2, Server.ADDRESS3);
+ strategyTest("resolver://info", feature, Server.ADDRESS3, null, false, false);
+ }
+
@Test
public void testSequentialStrategyWebClient() throws Exception {
FailoverFeature feature =
- getFeature(false, Server.ADDRESS3, Server.ADDRESS2);
- strategyTestWebClient(Server.ADDRESS1, feature, Server.ADDRESS3, null, false, false);
+ getFeature(false, false, Server.ADDRESS2, Server.ADDRESS3);
+ strategyTestWebClient(Server.ADDRESS1, feature, Server.ADDRESS2, null, false, false);
+ }
+
+ @Test
+ public void testRandomStrategyWebClient() throws Exception {
+ FailoverFeature feature =
+ getFeature(false, true, Server.ADDRESS3, Server.ADDRESS2);
+ strategyTestWebClient(Server.ADDRESS1, feature, Server.ADDRESS3, Server.ADDRESS2, false, true);
}
@Test
public void testRandomStrategy() throws Exception {
FailoverFeature feature =
- getFeature(true, Server.ADDRESS2, Server.ADDRESS3);
+ getFeature(false, true, Server.ADDRESS2, Server.ADDRESS3);
strategyTest(Server.ADDRESS1, feature, Server.ADDRESS2, Server.ADDRESS3, false, true);
}
@Test
public void testSequentialStrategyWithDiffBaseAddresses() throws Exception {
FailoverFeature feature =
- getFeature(false, Server.ADDRESS3, null);
+ getFeature(false, false, Server.ADDRESS3, null);
strategyTest(Server.ADDRESS1, feature, Server.ADDRESS3, Server.ADDRESS2, false, false);
}
@Test(expected = ServerWebApplicationException.class)
public void testSequentialStrategyWithServerException() throws Exception {
FailoverFeature feature =
- getFeature(false, Server.ADDRESS2, Server.ADDRESS3);
+ getFeature(false, false, Server.ADDRESS2, Server.ADDRESS3);
strategyTest(Server.ADDRESS1, feature, Server.ADDRESS2, Server.ADDRESS3, true, false);
}
@Test(expected = ClientWebApplicationException.class)
public void testSequentialStrategyFailure() throws Exception {
FailoverFeature feature =
- getFeature(false, "http://localhost:8080/non-existent");
+ getFeature(false, false, "http://localhost:8080/non-existent");
strategyTest(Server.ADDRESS1, feature, null, null, false, false);
}
- private FailoverFeature getFeature(boolean random, String ...address) {
+ private FailoverFeature getFeature(boolean custom, boolean random, String ...address) {
FailoverFeature feature = new FailoverFeature();
List<String> alternateAddresses = new ArrayList<String>();
for (String s : address) {
@@ -132,6 +149,11 @@ public class FailoverTest extends Abstra
strategy.setAlternateAddresses(alternateAddresses);
feature.setStrategy(strategy);
}
+ if (custom) {
+ FailoverTargetSelector selector = new ReplaceInitialAddressSelector();
+ feature.setTargetSelector(selector);
+ }
+
return feature;
}
@@ -275,4 +297,18 @@ public class FailoverTest extends Abstra
}
}
+ private static class ReplaceInitialAddressSelector extends FailoverTargetSelector {
+ @Override
+ public synchronized void prepare(Message message) {
+ EndpointInfo ei = getEndpoint().getEndpointInfo();
+ ei.setAddress(Server.ADDRESS3);
+ message.put(Message.ENDPOINT_ADDRESS, Server.ADDRESS3);
+ super.prepare(message);
+ }
+
+ @Override
+ protected boolean requiresFailover(Exchange exchange) {
+ return false;
+ }
+ }
}
Modified: cxf/trunk/systests/uncategorized/src/test/java/org/apache/cxf/systest/clustering/LoadDistributorAddressOverrideTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/uncategorized/src/test/java/org/apache/cxf/systest/clustering/LoadDistributorAddressOverrideTest.java?rev=1133016&r1=1133015&r2=1133016&view=diff
==============================================================================
--- cxf/trunk/systests/uncategorized/src/test/java/org/apache/cxf/systest/clustering/LoadDistributorAddressOverrideTest.java (original)
+++ cxf/trunk/systests/uncategorized/src/test/java/org/apache/cxf/systest/clustering/LoadDistributorAddressOverrideTest.java Tue Jun 7 14:02:31 2011
@@ -125,6 +125,7 @@ public class LoadDistributorAddressOverr
for (int i = 0; i < 12; ++i) {
try {
String response = greeter.greetMe("fred");
+ System.out.println(getCurrentEndpoint(greeter));
assertNotNull("expected non-null response", response);
incrementResponseCount(responseCounts, response);
} catch (WebServiceException ex) {