Author: kfujino
Date: Wed Apr 24 05:54:52 2013
New Revision: 1471259

URL: http://svn.apache.org/r1471259
Log:
Add several improvements for FarmWarDeployer.
Merged following revisions from /trunk.
includes r1467891, r1467893, r1468290, r1468311, r1469138, r1469144, r1469703, 
r1469708, r1470852, r1470859.

Modified:
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/LocalStrings.properties
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
    tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-deployer.xml

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java?rev=1471259&r1=1471258&r2=1471259&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java 
Wed Apr 24 05:54:52 2013
@@ -73,16 +73,28 @@ public class FarmWarDeployer extends Clu
     private static final String info = "FarmWarDeployer/1.2";
 
     /*--Instance Variables--------------------------------------*/
-    protected boolean started = false; //default 5 seconds
+    protected boolean started = false;
 
     protected HashMap<String, FileMessageFactory> fileFactories =
         new HashMap<String, FileMessageFactory>();
 
+    /**
+     * Deployment directory.
+     */
     protected String deployDir;
+    private File deployDirFile = null;
 
+    /**
+     * Temporary directory.
+     */
     protected String tempDir;
+    private File tempDirFile = null;
 
+    /**
+     * Watch directory.
+     */
     protected String watchDir;
+    private File watchDirFile = null;
 
     protected boolean watchEnabled = false;
 
@@ -171,17 +183,23 @@ public class FarmWarDeployer extends Clu
             return;
         }
         if (watchEnabled) {
-            watcher = new WarWatcher(this, new File(getWatchDir()));
+            watcher = new WarWatcher(this, getWatchDirFile());
             if (log.isInfoEnabled()) {
                 log.info(sm.getString(
                         "farmWarDeployer.watchDir", getWatchDir()));
             }
         }
-         
-        configBase = new File(
-                System.getProperty(Globals.CATALINA_BASE_PROP), "conf");
-        configBase = new File(configBase, engine.getName());
-        configBase = new File(configBase, hostname);
+
+        if (host.getXmlBase()!=null) {
+            configBase = getAbsolutePath(host.getXmlBase());
+        } else {
+            StringBuilder xmlDir = new StringBuilder("conf");
+            xmlDir.append('/');
+            xmlDir.append(engine.getName());
+            xmlDir.append('/');
+            xmlDir.append(host.getName());
+            configBase = getAbsolutePath(xmlDir.toString());
+        }
 
         // Retrieve the MBean server
         mBeanServer = Registry.getRegistry(null, null).getMBeanServer();
@@ -241,7 +259,7 @@ public class FarmWarDeployer extends Clu
                     String name = factory.getFile().getName();
                     if (!name.endsWith(".war"))
                         name = name + ".war";
-                    File deployable = new File(getDeployDir(), name);
+                    File deployable = new File(getDeployDirFile(), name);
                     try {
                         String contextName = fmsg.getContextName();
                         if (!isServiced(contextName)) {
@@ -312,7 +330,7 @@ public class FarmWarDeployer extends Clu
      */
     public synchronized FileMessageFactory getFactory(FileMessage msg)
             throws java.io.FileNotFoundException, java.io.IOException {
-        File writeToFile = new File(getTempDir(), msg.getFileName());
+        File writeToFile = new File(getTempDirFile(), msg.getFileName());
         FileMessageFactory factory = fileFactories.get(msg.getFileName());
         if (factory == null) {
             factory = FileMessageFactory.getInstance(writeToFile, true);
@@ -373,6 +391,8 @@ public class FarmWarDeployer extends Clu
     @Override
     public void install(String contextName, File webapp) throws IOException {
         Member[] members = getCluster().getMembers();
+        if (members.length == 0) return;
+
         Member localMember = getCluster().getLocalMember();
         FileMessageFactory factory =
             FileMessageFactory.getInstance(webapp, false);
@@ -420,15 +440,17 @@ public class FarmWarDeployer extends Clu
     @Override
     public void remove(String contextName, boolean undeploy)
             throws IOException {
-        if (log.isInfoEnabled())
-            log.info(sm.getString("farmWarDeployer.removeStart", contextName));
-        Member localMember = getCluster().getLocalMember();
-        UndeployMessage msg = new UndeployMessage(localMember, System
-                .currentTimeMillis(), "Undeploy:" + contextName + ":"
-                + System.currentTimeMillis(), contextName, undeploy);
-        if (log.isDebugEnabled())
-            log.debug(sm.getString("farmWarDeployer.removeTxMsg", 
contextName));
-        cluster.send(msg);
+        if (getCluster().getMembers().length > 0) {
+            if (log.isInfoEnabled())
+                log.info(sm.getString("farmWarDeployer.removeStart", 
contextName));
+            Member localMember = getCluster().getLocalMember();
+            UndeployMessage msg = new UndeployMessage(localMember, System
+                    .currentTimeMillis(), "Undeploy:" + contextName + ":"
+                    + System.currentTimeMillis(), contextName, undeploy);
+            if (log.isDebugEnabled())
+                log.debug(sm.getString("farmWarDeployer.removeTxMsg", 
contextName));
+            cluster.send(msg);
+        }
         // remove locally
         if (undeploy) {
             try {
@@ -459,16 +481,28 @@ public class FarmWarDeployer extends Clu
     @Override
     public void fileModified(File newWar) {
         try {
-            File deployWar = new File(getDeployDir(), newWar.getName());
-            copy(newWar, deployWar);
+            File deployWar = new File(getDeployDirFile(), newWar.getName());
             ContextName cn = new ContextName(deployWar.getName());
+            if (deployWar.exists() && deployWar.lastModified() > 
newWar.lastModified()) {
+                if (log.isInfoEnabled())
+                    log.info(sm.getString("farmWarDeployer.alreadyDeployed", 
cn.getName()));
+                return;
+            }
             if (log.isInfoEnabled())
                 log.info(sm.getString("farmWarDeployer.modInstall",
                         cn.getName(), deployWar.getAbsolutePath()));
-            try {
-                remove(cn.getName(), false);
-            } catch (Exception x) {
-                log.error(sm.getString("farmWarDeployer.modRemoveFail"), x);
+            // install local
+            if (!isServiced(cn.getName())) {
+                addServiced(cn.getName());
+                try {
+                    copy(newWar, deployWar);
+                    check(cn.getName());
+                } finally {
+                    removeServiced(cn.getName());
+                }
+            } else {
+                log.error(sm.getString("farmWarDeployer.servicingDeploy",
+                        cn.getName(), deployWar.getName()));
             }
             install(cn.getName(), deployWar);
         } catch (Exception x) {
@@ -585,9 +619,9 @@ public class FarmWarDeployer extends Clu
      */
     @Override
     public void backgroundProcess() {
-        if (started) {
+        if (started && watchEnabled) {
             count = (count + 1) % processDeployFrequency;
-            if (count == 0 && watchEnabled) {
+            if (count == 0) {
                 watcher.check();
             }
         }
@@ -649,6 +683,14 @@ public class FarmWarDeployer extends Clu
         return deployDir;
     }
 
+    public File getDeployDirFile() {
+        if (deployDirFile != null) return deployDirFile;
+
+        File dir = getAbsolutePath(getDeployDir());
+        this.deployDirFile = dir;
+        return dir;
+    }
+
     public void setDeployDir(String deployDir) {
         this.deployDir = deployDir;
     }
@@ -657,6 +699,14 @@ public class FarmWarDeployer extends Clu
         return tempDir;
     }
 
+    public File getTempDirFile() {
+        if (tempDirFile != null) return tempDirFile;
+
+        File dir = getAbsolutePath(getTempDir());
+        this.tempDirFile = dir;
+        return dir;
+    }
+
     public void setTempDir(String tempDir) {
         this.tempDir = tempDir;
     }
@@ -665,6 +715,14 @@ public class FarmWarDeployer extends Clu
         return watchDir;
     }
 
+    public File getWatchDirFile() {
+        if (watchDirFile != null) return watchDirFile;
+
+        File dir = getAbsolutePath(getWatchDir());
+        this.watchDirFile = dir;
+        return dir;
+    }
+
     public void setWatchDir(String watchDir) {
         this.watchDir = watchDir;
     }
@@ -738,4 +796,16 @@ public class FarmWarDeployer extends Clu
         return true;
     }
 
+    private File getAbsolutePath(String path) {
+        File dir = new File(path);
+        File base = new File(System.getProperty(Globals.CATALINA_BASE_PROP));
+        if (!dir.isAbsolute()) {
+            dir = new File(base, dir.getPath());
+        }
+        try {
+            dir = dir.getCanonicalFile();
+        } catch (IOException e) {// ignore
+        }
+        return dir;
+    }
 }

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/LocalStrings.properties?rev=1471259&r1=1471258&r2=1471259&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/LocalStrings.properties 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/LocalStrings.properties 
Wed Apr 24 05:54:52 2013
@@ -21,6 +21,7 @@ farmWarDeployer.fileCopyFail=Unable to c
 farmWarDeployer.hostOnly=FarmWarDeployer can only work as host cluster 
subelement!
 farmWarDeployer.hostParentEngine=FarmWarDeployer can only work if parent of 
[{0}] is an engine!
 farmWarDeployer.mbeanNameFail=Can't construct MBean object name for engine 
[{0}] and host [{1}]
+farmWarDeployer.alreadyDeployed=webapp [{0}] are already deployed.
 farmWarDeployer.modInstall=Installing webapp [{0}] from [{1}]
 farmWarDeployer.modRemoveFail=No removal
 farmWarDeployer.modInstallFail=Unable to install WAR file

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml?rev=1471259&r1=1471258&r2=1471259&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml 
Wed Apr 24 05:54:52 2013
@@ -39,5 +39,9 @@
       name="watchEnabled"
       description="Is watching enabled?"
       type="boolean"/>
+    <attribute
+      name="processDeployFrequency"
+      description="Frequency of the Farm watchDir check."
+      type="int"/>
   </mbean>
 </mbeans-descriptors>

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java?rev=1471259&r1=1471258&r2=1471259&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java Wed 
Apr 24 05:54:52 2013
@@ -1458,9 +1458,8 @@ public class HostConfig
         DeployedApplication app = deployed.get(name);
         if (app != null) {
             checkResources(app);
-        } else {
-            deployApps(name);
         }
+        deployApps(name);
     }
 
     /**

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1471259&r1=1471258&r2=1471259&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Wed Apr 24 05:54:52 2013
@@ -77,6 +77,13 @@
       </fix>
     </changelog>
   </subsection>
+  <subsection name="Cluster">
+    <changelog>
+      <fix>
+        Add several improvements for FarmWarDeployer. (kfujino)
+      </fix>
+    </changelog>
+  </subsection>
   <subsection name="Web applications">
     <changelog>
       <fix>

Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-deployer.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-deployer.xml?rev=1471259&r1=1471258&r2=1471259&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-deployer.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-deployer.xml Wed Apr 24 
05:54:52 2013
@@ -34,29 +34,59 @@
 </section>
 
 <section name="Introduction">
-  <p>TODO - Complete documentation</p>
-
-
+  <p>The Farm War Deployer can deploy and undeploy web applications on the 
other
+  nodes in the cluster.</p>
+  <p><strong>Note: </strong>FarmWarDeployer can be configured at host level
+  cluster only.
+  </p>
 </section>
 
 
-<section name="Attributes">
-
-  <subsection name="Common Attributes">
-
-  <attributes>
+<section name="org.apache.catalina.ha.deploy.FarmWarDeployer">
 
-    <attribute name="className" required="true">
-
-    </attribute>
-
-
-  </attributes>
+  <subsection name="Attributes">
 
+    <attributes>
+      <attribute name="className" required="true">
+        The cluster deployer class, currently only one is available,
+        <code>org.apache.catalina.ha.deploy.FarmWarDeployer.</code>
+      </attribute>
+      <attribute name="deployDir" required="true">
+        Deployment directory. This is the pathname of a directory where deploy
+        the web applications. You may specify an absolute pathname, or a
+        pathname that is relative to the $CATALINA_BASE directory. In the
+        current implementation, this attribute must be the same value as the
+        <strong>Host's appBase</strong>.
+      </attribute>
+      <attribute name="tempDir" required="true">
+        The temporaryDirectory to store binary data when downloading a war from
+        the cluster. You may specify an absolute pathname, or a pathname that 
is
+        relative to the $CATALINA_BASE directory.
+      </attribute>
+      <attribute name="watchDir" required="false">
+        This is the pathname of a directory where watch for 
changes(add/modify/remove)
+        of web applications. You may specify an absolute pathname, or a 
pathname
+        that is relative to the $CATALINA_BASE directory.
+        <strong>Note: </strong> if <strong>watchEnabled</strong> is false, this
+        attribute will have no effect.
+      </attribute>
+      <attribute name="watchEnabled" required="false">
+        Set to true if you want to watch for changes of web applications.
+        Only when this attribute set to true, you can trigger a deploy/undeploy
+        of web applications. The flag's value defaults to false.
+      </attribute>
+      <attribute name="processDeployFrequency" required="false">
+        Frequency of the Farm watchDir check. Cluster wide deployment will be
+        done once for the specified amount of backgrondProcess calls (ie, the
+        lower the amount, the most often the checks will occur). The minimum
+        value is 1, and the default value is 2.
+        <strong>Note: </strong> if <strong>watchEnabled</strong> is false, this
+        attribute will have no effect.
+      </attribute>
+    </attributes>
 
   </subsection>
 
-
 </section>
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to