Author: dblevins
Date: Wed May 19 01:28:59 2010
New Revision: 945989

URL: http://svn.apache.org/viewvc?rev=945989&view=rev
Log:
OPENEJB-1281: Preconfigured failover with JNDI provider url such as 
"failover:ejbd://foo:4201,ejbd://bar:4201"

Added:
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/FailoverConnectionFactory.java
   (with props)
    
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FailoverConnectionFactoryTest.java
   (contents, props changed)
      - copied, changed from r943838, 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java
Modified:
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ClusterMetaData.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RandomConnectionStrategy.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RoundRobinConnectionStrategy.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/StickyConnectionStrategy.java

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ClusterMetaData.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ClusterMetaData.java?rev=945989&r1=945988&r2=945989&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ClusterMetaData.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ClusterMetaData.java
 Wed May 19 01:28:59 2010
@@ -56,6 +56,10 @@ public class ClusterMetaData implements 
         return version;
     }
 
+    public void setConnectionStrategy(String connectionStrategy) {
+        this.connectionStrategy = connectionStrategy;
+    }
+
     public String getConnectionStrategy() {
         return connectionStrategy;
     }

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java?rev=945989&r1=945988&r2=945989&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
 Wed May 19 01:28:59 2010
@@ -37,6 +37,7 @@ public class ConnectionManager {
         factories.register("https", httpFactory);
 
         factories.register("multicast", new MulticastConnectionFactory());
+        factories.register("failover", new FailoverConnectionFactory());
         
         strategies.register("sticky", new StickyConnectionStrategy());
         strategies.register("random", new RandomConnectionStrategy());

Added: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/FailoverConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/FailoverConnectionFactory.java?rev=945989&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/FailoverConnectionFactory.java
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/FailoverConnectionFactory.java
 Wed May 19 01:28:59 2010
@@ -0,0 +1,92 @@
+/**
+ * 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.openejb.client;
+
+import java.net.URI;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This factory supports the following URI format
+ *
+ *  failover:[strategy:]urlList
+ *
+ * Where strategy and urlList are variables
+ *
+ * strategy = the ConnectionStrategy name, such as "sticky", "round-robin",
+ * or "random".  This parameter is optional.
+ *
+ * urlList = a comma separated list connection URIs.  There must be a
+ * ConnectionFactory installed for the associated URI.
+ *
+ * Some examples might be:
+ *
+ *  - failover:ejbd://foo:4201,ejbd://bar:4201
+ *  - failover:random:ejbd://foo:4201,ejbd://bar:4201
+ *  - 
failover:round-robin:ejbd://foo:4201,ejbds://bar:4201,multicast://239.255.2.3:6142
+ *
+ * The final URI being the most clever in that it will sequentially go
+ * through the list, first attempting a couple hard-coded addresses before
+ * finally resorting to multicast in an attempt to discover a server.
+ *
+ * @version $Rev$ $Date$
+ */
+public class FailoverConnectionFactory implements ConnectionFactory {
+
+    public Connection getConnection(URI failoverUri) throws IOException {
+
+        // URI can be in the following formats:
+        //
+        // failover:ejbd://foo:4201,ejbd://bar:4202
+        // failover:sticky:ejbd://foo:4201,ejbd://bar:4202
+
+        // trim off the "failover:"
+        String remainder = failoverUri.getSchemeSpecificPart();
+
+        URI uri = URI.create(remainder);
+
+        String strategy = uri.getScheme();
+        String servers = uri.getSchemeSpecificPart();
+
+        if (servers.startsWith("//")) {
+            strategy = "default";
+            servers = remainder;
+        }
+
+        List<URI> list = new ArrayList<URI>();
+        
+        for (String server : servers.split(",")) {
+            list.add(URI.create(server));
+        }
+
+        URI[] uris = list.toArray(new URI[0]);
+
+        ClusterMetaData data = new ClusterMetaData(0, uris);
+        data.setConnectionStrategy(strategy);
+
+        return ConnectionManager.getConnection(data, new ServerMetaData(), 
null);
+    }
+
+
+    public static void main(String[] args) throws IOException {
+        FailoverConnectionFactory factory = new FailoverConnectionFactory();
+
+        URI uri = URI.create("failover:ejbd://foo:4201,ejbd://bar:4202");
+        Connection connection = factory.getConnection(uri);
+    }
+}

Propchange: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/FailoverConnectionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RandomConnectionStrategy.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RandomConnectionStrategy.java?rev=945989&r1=945988&r2=945989&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RandomConnectionStrategy.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RandomConnectionStrategy.java
 Wed May 19 01:28:59 2010
@@ -66,7 +66,7 @@ public class RandomConnectionStrategy im
             }
         }
 
-        if (available.size() == 0 && !failed.contains(server.getLocation())){
+        if (available.size() == 0 && server.getLocation() != null && 
!failed.contains(server.getLocation())){
             return connect(cluster, server.getLocation());
         }
 

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RoundRobinConnectionStrategy.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RoundRobinConnectionStrategy.java?rev=945989&r1=945988&r2=945989&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RoundRobinConnectionStrategy.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RoundRobinConnectionStrategy.java
 Wed May 19 01:28:59 2010
@@ -76,7 +76,7 @@ public class RoundRobinConnectionStrateg
 
         remaining.removeAll(failed);
 
-        if (remaining.size() == 0 && !failed.contains(server.getLocation())){
+        if (remaining.size() == 0 && server.getLocation() != null && 
!failed.contains(server.getLocation())){
             return connect(cluster, server.getLocation());
         }
 

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/StickyConnectionStrategy.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/StickyConnectionStrategy.java?rev=945989&r1=945988&r2=945989&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/StickyConnectionStrategy.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/StickyConnectionStrategy.java
 Wed May 19 01:28:59 2010
@@ -67,7 +67,7 @@ public class StickyConnectionStrategy im
 
         remaining.removeAll(failed);
 
-        if (remaining.size() == 0 && !failed.contains(server.getLocation())){
+        if (remaining.size() == 0 && server.getLocation() != null && 
!failed.contains(server.getLocation())){
             return connect(cluster, server.getLocation());
         }
 

Copied: 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FailoverConnectionFactoryTest.java
 (from r943838, 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java)
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FailoverConnectionFactoryTest.java?p2=openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FailoverConnectionFactoryTest.java&p1=openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java&r1=943838&r2=945989&rev=945989&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FailoverConnectionFactoryTest.java
 Wed May 19 01:28:59 2010
@@ -46,7 +46,7 @@ import java.util.concurrent.atomic.Atomi
 /**
  * @version $Rev$ $Date$
  */
-public class DynamicConnectionStrategyTest extends TestCase {
+public class FailoverConnectionFactoryTest extends TestCase {
 
     public void test() throws Exception {
 
@@ -80,7 +80,7 @@ public class DynamicConnectionStrategyTe
 
         Properties props = new Properties();
         props.put("java.naming.factory.initial", 
"org.apache.openejb.client.RemoteInitialContextFactory");
-        props.put("java.naming.provider.url", "ejbd://127.0.0.1:" + port);
+        props.put("java.naming.provider.url", 
"failover:sticky:ejbd://agwdt:9999,ejbd://127.0.0.1:" + port);
         Context context = new InitialContext(props);
 
         Widget remote = (Widget) context.lookup("WidgetBeanRemote");

Propchange: 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FailoverConnectionFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to