You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by up...@apache.org on 2007/12/14 12:23:35 UTC

svn commit: r604168 - in /webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs: PollTableEntry.java VFSConstants.java VFSOutTransportInfo.java VFSTransportListener.java VFSTransportSender.java VFSUtils.java

Author: upul
Date: Fri Dec 14 03:23:05 2007
New Revision: 604168

URL: http://svn.apache.org/viewvc?rev=604168&view=rev
Log:
added timeout and retry for vfs transport

Modified:
    webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/PollTableEntry.java
    webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java
    webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java
    webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportListener.java
    webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java
    webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java

Modified: webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/PollTableEntry.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/PollTableEntry.java?rev=604168&r1=604167&r2=604168&view=diff
==============================================================================
--- webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/PollTableEntry.java (original)
+++ webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/PollTableEntry.java Fri Dec 14 03:23:05 2007
@@ -65,6 +65,8 @@
     /** where to move the file after total failure */
     private String moveAfterFailure;
 
+    private int maxRetryCount;
+    private long reconnectTimeout;
 
     public String getServiceName() {
         return serviceName;
@@ -201,4 +203,21 @@
             this.moveAfterFailure = moveAfterFailure;
         }
     }
+
+    public int getMaxRetryCount() {
+      return maxRetryCount;
+    }
+
+    public void setMaxRetryCount(int maxRetryCount) {
+      this.maxRetryCount = maxRetryCount;
+    }
+
+    public long getReconnectTimeout() {
+      return reconnectTimeout;
+    }
+
+    public void setReconnectTimeout(long reconnectTimeout) {
+      this.reconnectTimeout = reconnectTimeout;
+    }
+    
 }

Modified: webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java?rev=604168&r1=604167&r2=604168&view=diff
==============================================================================
--- webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java (original)
+++ webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSConstants.java Fri Dec 14 03:23:05 2007
@@ -39,7 +39,12 @@
     public static final String REPLY_FILE_NAME = "transport.vfs.ReplyFileName";
 
     public static final String DEFAULT_RESPONSE_FILE = "response.xml";
-
+    
+    public static final String MAX_RETRY_COUNT = "transport.vfs.MaxRetryCount";
+    public static final String RECONNECT_TIMEOUT = "transport.vfs.ReconnectTimeout";
+    public static final int DEFAULT_MAX_RETRY_COUNT = 3;
+    public static final long DEFAULT_RECONNECT_TIMEOUT = 30000;
+    
     // transport header property names used by the VFS transport
     public static final String FILE_PATH = "FILE_PATH";
     public static final String FILE_NAME = "FILE_NAME";

Modified: webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java?rev=604168&r1=604167&r2=604168&view=diff
==============================================================================
--- webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java (original)
+++ webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSOutTransportInfo.java Fri Dec 14 03:23:05 2007
@@ -19,10 +19,17 @@
 
 package org.apache.synapse.transport.vfs;
 
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.StringTokenizer;
+
 import org.apache.axis2.transport.OutTransportInfo;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import com.sun.net.ssl.internal.www.protocol.https.Handler;
+
 /**
  * The VFS OutTransportInfo is a holder of information to send an outgoing message
  * (e.g. a Response) to a VFS destination. Thus at a minimum a reference to a
@@ -35,6 +42,8 @@
     private String outFileURI = null;
     private String outFileName = null;
     private String contentType = null;
+    private int maxRetryCount = 3;
+    private long reconnectTimeout = 30000;
 
     VFSOutTransportInfo(String outFileURI) {
         if (outFileURI.startsWith(VFSConstants.VFS_PREFIX)) {
@@ -42,6 +51,16 @@
         } else {
             this.outFileURI = outFileURI;
         }
+        
+        Map properties = getProperties(outFileURI);
+        if(properties.containsKey(VFSConstants.MAX_RETRY_COUNT)) {
+          String strMaxRetryCount = (String) properties.get(VFSConstants.MAX_RETRY_COUNT);
+            maxRetryCount = Integer.parseInt(strMaxRetryCount);
+        }
+        if(properties.containsKey(VFSConstants.RECONNECT_TIMEOUT)) {
+          String strReconnectTimeout = (String) properties.get(VFSConstants.RECONNECT_TIMEOUT);
+            reconnectTimeout = Long.parseLong(strReconnectTimeout) * 1000;
+        }        
     }
 
     public void setContentType(String contentType) {
@@ -55,4 +74,38 @@
     public String getOutFileName() {
         return outFileName;
     }
-}
+
+    public int getMaxRetryCount() {
+      return maxRetryCount;
+    }
+
+    public void setMaxRetryCount(int maxRetryCount) {
+      this.maxRetryCount = maxRetryCount;
+    }
+
+    public long getReconnectTimeout() {
+      return reconnectTimeout;
+    }
+
+    public void setReconnectTimeout(long reconnectTimeout) {
+      this.reconnectTimeout = reconnectTimeout;
+    }
+    
+    public static Map getProperties(String url) {
+        Map h = new HashMap();
+        int propPos = url.indexOf("?");
+        if (propPos != -1) {
+            StringTokenizer st = new StringTokenizer(url.substring(propPos + 1), "&");
+            while (st.hasMoreTokens()) {
+                String token = st.nextToken();
+                int sep = token.indexOf("=");
+                if (sep != -1) {
+                    h.put(token.substring(0, sep), token.substring(sep + 1));
+                } else {
+                    continue; // ignore, what else can we do?
+                }
+            }
+        }
+        return h;
+    }
+}
\ No newline at end of file

Modified: webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportListener.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportListener.java?rev=604168&r1=604167&r2=604168&view=diff
==============================================================================
--- webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportListener.java (original)
+++ webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportListener.java Fri Dec 14 03:23:05 2007
@@ -145,21 +145,43 @@
     private void scanFileOrDirectory(final PollTableEntry entry, String fileURI) {
 
         FileObject fileObject = null;
-        try {
-            if (log.isDebugEnabled()) {
-                log.debug("Scanning directory or file : " + fileURI);
-            }
-            fileObject = fsManager.resolveFile(fileURI);
-            
-        } catch (FileSystemException e) {
-            processFailure("Unable to resolve file or directory : " + fileURI, e, entry);
-            return;
-        }
 
-        if(fileObject == null) {
-            processFailure("Failed to resolve file " + fileURI, null, entry);
-            return;
+        if (log.isDebugEnabled()) {
+            log.debug("Scanning directory or file : " + fileURI);
         }
+      
+        boolean wasError = true;
+        int retryCount = 0;
+        int maxRetryCount = entry.getMaxRetryCount();
+        long reconnectionTimeout = entry.getReconnectTimeout();
+        
+        while(wasError == true) {
+          try {
+            retryCount++;
+            fileObject = fsManager.resolveFile(fileURI);
+            
+            if(fileObject == null) {
+              log.error("fileObject is null");
+              throw new FileSystemException("fileObject is null");
+            }
+            
+            wasError = false;
+                                
+          } catch(FileSystemException e) {
+            log.error("cannot resolve fileObject", e);
+            if(maxRetryCount <= retryCount)
+              processFailure("cannot resolve fileObject repeatedly: " + e.getMessage(), e, entry);
+              return;
+          }
+        
+          if(wasError == true) {
+            try {
+              Thread.sleep(reconnectionTimeout);
+            } catch (InterruptedException e2) {
+              e2.printStackTrace();
+            }
+          }
+        }            
         
         try {
             if (fileObject.exists() && fileObject.isReadable()) {
@@ -486,6 +508,16 @@
                 service, VFSConstants.TRANSPORT_FILE_MOVE_AFTER_FAILURE);
             entry.setMoveAfterFailure(moveDirectoryAfterFailure);
 
+            String strMaxRetryCount = BaseUtils.getOptionalServiceParam(
+                service, VFSConstants.MAX_RETRY_COUNT);
+            if(strMaxRetryCount != null)
+              entry.setMaxRetryCount(Integer.parseInt(strMaxRetryCount));
+
+            String strReconnectTimeout = BaseUtils.getOptionalServiceParam(
+                service, VFSConstants.RECONNECT_TIMEOUT);            
+            if(strReconnectTimeout != null)
+              entry.setReconnectTimeout(Integer.parseInt(strReconnectTimeout) * 1000);
+            
             entry.setServiceName(service.getName());
             schedulePoll(service, pollInterval);            
             pollTable.add(entry);

Modified: webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java?rev=604168&r1=604167&r2=604168&view=diff
==============================================================================
--- webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java (original)
+++ webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java Fri Dec 14 03:23:05 2007
@@ -102,7 +102,39 @@
         if (vfsOutInfo != null) {
             FileObject replyFile = null;
             try {
-                replyFile = fsManager.resolveFile(vfsOutInfo.getOutFileURI());
+                
+                boolean wasError = true;
+                int retryCount = 0;
+                int maxRetryCount = VFSUtils.getMaxRetryCount(msgCtx, vfsOutInfo);
+                long reconnectionTimeout = VFSUtils.getReconnectTimout(msgCtx, vfsOutInfo);
+                
+                while(wasError == true) {
+                  try {
+                    retryCount++;
+                    replyFile = fsManager.resolveFile(vfsOutInfo.getOutFileURI());
+                    
+                    if(replyFile == null) {
+                      log.error("replyFile is null");
+                      throw new FileSystemException("replyFile is null");
+                    }
+                    
+                    wasError = false;
+                                        
+                  } catch(FileSystemException e) {
+                    log.error("cannot resolve replyFile", e);
+                    if(maxRetryCount <= retryCount)
+                      handleException("cannot resolve replyFile repeatedly: " + e.getMessage(), e);
+                  }
+                
+                  if(wasError == true) {
+                    try {
+                      Thread.sleep(reconnectionTimeout);
+                    } catch (InterruptedException e2) {
+                      e2.printStackTrace();
+                    }
+                  }
+                }
+                
                 if (replyFile.exists()) {
 
                     if (replyFile.getType() == FileType.FOLDER) {

Modified: webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java?rev=604168&r1=604167&r2=604168&view=diff
==============================================================================
--- webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java (original)
+++ webservices/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/vfs/VFSUtils.java Fri Dec 14 03:23:05 2007
@@ -120,7 +120,23 @@
         }
         return fileName;
     }
+    
+    public static int getMaxRetryCount(MessageContext msgCtx, VFSOutTransportInfo vfsOutInfo) {
+          if(vfsOutInfo.getMaxRetryCount() != 0) {
+            return vfsOutInfo.getMaxRetryCount();
+          }
+          
+          return VFSConstants.DEFAULT_MAX_RETRY_COUNT; 
+    }    
 
+    public static long getReconnectTimout(MessageContext msgCtx, VFSOutTransportInfo vfsOutInfo) {
+      if(vfsOutInfo.getReconnectTimeout() != 0) {
+        return vfsOutInfo.getReconnectTimeout();
+      }
+
+      return VFSConstants.DEFAULT_RECONNECT_TIMEOUT; 
+    }   
+    
     public static byte[] getBytesFromInputStream(InputStream is, int length) throws IOException {
 
         byte[] bytes = new byte[length];



---------------------------------------------------------------------
To unsubscribe, e-mail: synapse-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: synapse-dev-help@ws.apache.org