/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.cxf; import java.util.ArrayList; import java.util.List; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.test.AvailablePortFinder; import org.apache.cxf.clustering.FailoverFeature; import org.apache.cxf.clustering.RandomStrategy; import org.apache.cxf.frontend.ClientProxyFactoryBean; import org.apache.cxf.frontend.ServerFactoryBean; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class FailOverFeatureTest { private static int port1 = CXFTestSupport.getPort1(); private static int port2 = CXFTestSupport.getPort2(); private static int port3 = CXFTestSupport.getPort3(); private static int port4 = AvailablePortFinder.getNextAvailable(); private static final String SERVICE_ADDRESS = "http://localhost:" + port1 + "/FailOverFeatureTest"; private static final String PAYLOAD_PROXY_ADDRESS = "http://localhost:" + port2 + "/FailOverFeatureTest/proxy"; private static final String POJO_PROXY_ADDRESS = "http://localhost:" + port3 + "/FailOverFeatureTest/proxy"; private static final String NONE_EXIST_ADDRESS = "http://localhost:" + port4 + "/FailOverFeatureTest"; private DefaultCamelContext context1; private DefaultCamelContext context2; @BeforeClass public static void init() { // publish a web-service ServerFactoryBean factory = new ServerFactoryBean(); factory.setAddress(SERVICE_ADDRESS); factory.setServiceBean(new HelloServiceImpl()); factory.create(); } @Test public void testPojo() throws Exception { startRoutePojo(); Assert.assertEquals("hello", tryFailover(POJO_PROXY_ADDRESS)); if (context2 != null) { context2.stop(); } } @Test public void testPayload() throws Exception { startRoutePayload(); Assert.assertEquals("hello", tryFailover(PAYLOAD_PROXY_ADDRESS)); if (context1 != null) { context1.stop(); } } private void startRoutePayload() throws Exception { String proxy = "cxf://" + PAYLOAD_PROXY_ADDRESS + "?wsdlURL=" + SERVICE_ADDRESS + "?wsdl" + "&dataFormat=PAYLOAD"; // use a non-exists address to trigger fail-over // another problem is: if synchronous=false fail-over will not happen String real = "cxf://" + NONE_EXIST_ADDRESS + "?wsdlURL=" + SERVICE_ADDRESS + "?wsdl" + "&dataFormat=PAYLOAD"; context1 = new DefaultCamelContext(); startRoute(context1, proxy, real); } private void startRoutePojo() throws Exception { String proxy = "cxf://" + POJO_PROXY_ADDRESS + "?serviceClass=" + "org.apache.camel.component.cxf.HelloService" + "&dataFormat=POJO"; // use a non-exists address to trigger fail-over String real = "cxf://" + NONE_EXIST_ADDRESS + "?serviceClass=" + "org.apache.camel.component.cxf.HelloService" + "&dataFormat=POJO"; context2 = new DefaultCamelContext(); startRoute(context2, proxy, real); } private void startRoute(DefaultCamelContext ctx, final String proxy, final String real) throws Exception { ctx.addRoutes(new RouteBuilder() { public void configure() { String alt = SERVICE_ADDRESS; List<String> serviceList = new ArrayList<String>(); serviceList.add(alt); RandomStrategy strategy = new RandomStrategy(); strategy.setAlternateAddresses(serviceList); FailoverFeature ff = new FailoverFeature(); ff.setStrategy(strategy); CxfEndpoint endpoint = (CxfEndpoint)(endpoint(real)); endpoint.getFeatures().add(ff); from(proxy).to(endpoint); } }); ctx.start(); } private String tryFailover(String url) { ClientProxyFactoryBean factory = new ClientProxyFactoryBean(); factory.setServiceClass(HelloService.class); factory.setAddress(url); HelloService client = (HelloService)factory.create(); return client.sayHello(); } }