You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2009/08/12 01:24:59 UTC

svn commit: r803322 - in /tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi: DefaultRMIHost.java RMISocketFactoryImpl.java

Author: rfeng
Date: Tue Aug 11 23:24:58 2009
New Revision: 803322

URL: http://svn.apache.org/viewvc?rev=803322&view=rev
Log:
Use a customized socket factory for registry to control timeout

Added:
    tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java   (with props)
Modified:
    tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java

Modified: tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java?rev=803322&r1=803321&r2=803322&view=diff
==============================================================================
--- tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java (original)
+++ tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java Tue Aug 11 23:24:58 2009
@@ -27,11 +27,13 @@
 import java.rmi.RemoteException;
 import java.rmi.registry.LocateRegistry;
 import java.rmi.registry.Registry;
+import java.rmi.server.RMISocketFactory;
 import java.rmi.server.UnicastRemoteObject;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Logger;
 
+
 /**
  * Default implementation of a RMI host.
  *
@@ -39,16 +41,18 @@
  */
 public class DefaultRMIHost implements RMIHost {
     private final static Logger logger = Logger.getLogger(DefaultRMIHost.class.getName());
+    private static final int CONNECTION_TIMEOUT = 3000; // 3 seconds
+
     // Map of RMI registries started and running
     private Map<String, Registry> rmiRegistries;
+    
+    private RMISocketFactory socketFactory;
 
     public DefaultRMIHost() {
         rmiRegistries = new ConcurrentHashMap<String, Registry>();
-        /*
-         * if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); }
-         */
+        this.socketFactory = new RMISocketFactoryImpl(CONNECTION_TIMEOUT);
     }
-
+    
     public void registerService(String uri, Remote serviceObject) throws RMIHostException, RMIHostRuntimeException {
         RMIURI rmiURI = new RMIURI(uri);
 
@@ -57,10 +61,11 @@
             registry = rmiRegistries.get(Integer.toString(rmiURI.port));
             if (registry == null) {
                 try {
-                    registry = LocateRegistry.getRegistry(rmiURI.port);
+                    registry = LocateRegistry.getRegistry(null, rmiURI.port, socketFactory);
+                    // FIXME: It takes about 15 seconds to time out
                     registry.lookup(rmiURI.serviceName);
                 } catch (RemoteException e) {
-                    registry = LocateRegistry.createRegistry(rmiURI.port);
+                    registry = LocateRegistry.createRegistry(rmiURI.port, socketFactory, socketFactory);
                 } catch (NotBoundException e) {
                     // Ignore
                 }
@@ -84,7 +89,7 @@
         try {
             Registry registry = rmiRegistries.get(Integer.toString(rmiURI.port));
             if (registry == null) {
-                registry = LocateRegistry.getRegistry(rmiURI.port);
+                registry = LocateRegistry.getRegistry(null, rmiURI.port, socketFactory);
                 rmiRegistries.put(Integer.toString(rmiURI.port), registry);
             }
             registry.unbind(rmiURI.serviceName);
@@ -105,7 +110,7 @@
         try {
             // Requires permission java.net.SocketPermission "host:port", "connect,accept,resolve"
             // in security policy.
-            Registry registry = LocateRegistry.getRegistry(rmiURI.host, rmiURI.port);
+            Registry registry = LocateRegistry.getRegistry(rmiURI.host, rmiURI.port, socketFactory);
 
             if (registry != null) {
                 remoteService = registry.lookup(rmiURI.serviceName);

Added: tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java?rev=803322&view=auto
==============================================================================
--- tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java (added)
+++ tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java Tue Aug 11 23:24:58 2009
@@ -0,0 +1,57 @@
+/*
+ * 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.tuscany.sca.host.rmi;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.rmi.server.RMISocketFactory;
+
+import javax.net.ServerSocketFactory;
+import javax.net.SocketFactory;
+
+class RMISocketFactoryImpl extends RMISocketFactory {
+    private int clientTimeout;
+    private SocketFactory factory;
+    private ServerSocketFactory serverSocketFactory;
+
+    /**
+     * @param timeout
+     */
+    public RMISocketFactoryImpl(int clientTimeout) {
+        super();
+        this.clientTimeout = clientTimeout;
+        this.factory = SocketFactory.getDefault();
+        this.serverSocketFactory = ServerSocketFactory.getDefault();
+    }
+
+    public Socket createSocket(String host, int port) throws IOException {
+        Socket socket = factory.createSocket(host, port);
+        socket.setSoTimeout(clientTimeout);
+        return socket;
+    }
+
+    @Override
+    public ServerSocket createServerSocket(int port) throws IOException {
+        ServerSocket socket = serverSocketFactory.createServerSocket(port);
+        return socket;
+    }
+
+}

Propchange: tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date