Selaa lähdekoodia

synchronize process builder

Shinsuke Sugaya 9 vuotta sitten
vanhempi
commit
9b6d0e5248

+ 3 - 3
src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java

@@ -194,7 +194,7 @@ public class AdminSearchlistAction extends FessAdminAction {
         verifyToken(() -> asListHtml());
         validate(form, messages -> {}, () -> asListHtml());
         final String docId = form.docId;
-        if (jobHelper.isCrawlProcessRunning()) {
+        if (jobHelper.isProcessRunning()) {
             throwValidationError(messages -> messages.addErrorsCannotDeleteDocBecauseOfRunning(GLOBAL), () -> asListHtml());
         }
         try {
@@ -211,7 +211,7 @@ public class AdminSearchlistAction extends FessAdminAction {
     public HtmlResponse deleteall(final ListForm form) {
         verifyToken(() -> asListHtml());
         validate(form, messages -> {}, () -> asListHtml());
-        if (jobHelper.isCrawlProcessRunning()) {
+        if (jobHelper.isProcessRunning()) {
             throwValidationError(messages -> messages.addErrorsCannotDeleteDocBecauseOfRunning(GLOBAL), () -> asListHtml());
         }
         try {
@@ -227,7 +227,7 @@ public class AdminSearchlistAction extends FessAdminAction {
     }
 
     public boolean isSolrProcessRunning() {
-        return jobHelper.isCrawlProcessRunning();
+        return jobHelper.isProcessRunning();
     }
 
     // ===================================================================================

+ 1 - 1
src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java

@@ -289,7 +289,7 @@ public class AdminWizardAction extends FessAdminAction {
     @Execute
     public HtmlResponse startCrawling(final StartCrawlingForm form) {
         verifyToken(() -> asIndexHtml());
-        if (!jobHelper.isCrawlProcessRunning()) {
+        if (!jobHelper.isProcessRunning()) {
             final List<ScheduledJob> scheduledJobList = scheduledJobService.getCrawlerJobList();
             for (final ScheduledJob scheduledJob : scheduledJobList) {
                 new Thread(() -> new TriggeredJob().execute(scheduledJob)).start();

+ 14 - 9
src/main/java/org/codelibs/fess/helper/JobHelper.java

@@ -16,10 +16,12 @@
 package org.codelibs.fess.helper;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
 
 import javax.annotation.PreDestroy;
 
@@ -41,32 +43,34 @@ public class JobHelper {
     @PreDestroy
     public void destroy() {
         for (final String sessionId : runningProcessMap.keySet()) {
-            destroyCrawlerProcess(sessionId);
+            destroyProcess(sessionId);
         }
     }
 
-    public JobProcess startCrawlerProcess(final String sessionId, final ProcessBuilder processBuilder) {
-        destroyCrawlerProcess(sessionId);
+    public synchronized JobProcess startProcess(String sessionId, List<String> cmdList, Consumer<ProcessBuilder> pbCall) {
+        ProcessBuilder pb = new ProcessBuilder(cmdList);
+        pbCall.accept(pb);
+        destroyProcess(sessionId);
         JobProcess jobProcess;
         try {
-            jobProcess = new JobProcess(processBuilder.start());
-            destroyCrawlerProcess(runningProcessMap.putIfAbsent(sessionId, jobProcess));
+            jobProcess = new JobProcess(pb.start());
+            destroyProcess(runningProcessMap.putIfAbsent(sessionId, jobProcess));
             return jobProcess;
         } catch (final IOException e) {
             throw new FessSystemException("Crawler Process terminated.", e);
         }
     }
 
-    public void destroyCrawlerProcess(final String sessionId) {
+    public void destroyProcess(final String sessionId) {
         final JobProcess jobProcess = runningProcessMap.remove(sessionId);
-        destroyCrawlerProcess(jobProcess);
+        destroyProcess(jobProcess);
     }
 
-    public boolean isCrawlProcessRunning() {
+    public boolean isProcessRunning() {
         return !runningProcessMap.isEmpty();
     }
 
-    protected void destroyCrawlerProcess(final JobProcess jobProcess) {
+    protected void destroyProcess(final JobProcess jobProcess) {
         if (jobProcess != null) {
             final InputStreamThread ist = jobProcess.getInputStreamThread();
             try {
@@ -124,4 +128,5 @@ public class JobHelper {
     public JobExecutor getJobExecutoer(final String id) {
         return runningJobExecutorMap.get(id);
     }
+
 }

+ 6 - 7
src/main/java/org/codelibs/fess/job/CrawlJob.java

@@ -208,7 +208,7 @@ public class CrawlJob {
         }
 
         if (jobExecutor != null) {
-            jobExecutor.addShutdownListener(() -> ComponentUtil.getJobHelper().destroyCrawlerProcess(sessionId));
+            jobExecutor.addShutdownListener(() -> ComponentUtil.getJobHelper().destroyProcess(sessionId));
         }
 
         try {
@@ -350,12 +350,11 @@ public class CrawlJob {
             logger.info("Crawler: \nDirectory=" + baseDir + "\nOptions=" + cmdList);
         }
 
-        final ProcessBuilder pb = new ProcessBuilder(cmdList);
-        pb.directory(baseDir);
-        pb.redirectErrorStream(true);
-
         try {
-            final JobProcess jobProcess = jobHelper.startCrawlerProcess(sessionId, pb);
+            final JobProcess jobProcess = jobHelper.startProcess(sessionId, cmdList, pb -> {
+                pb.directory(baseDir);
+                pb.redirectErrorStream(true);
+            });
 
             final InputStreamThread it = jobProcess.getInputStreamThread();
             it.start();
@@ -380,7 +379,7 @@ public class CrawlJob {
             throw new FessSystemException("Crawler Process terminated.", e);
         } finally {
             try {
-                jobHelper.destroyCrawlerProcess(sessionId);
+                jobHelper.destroyProcess(sessionId);
             } finally {
                 deleteTempDir(ownTmpDir);
             }

+ 1 - 1
src/main/java/org/codelibs/fess/job/JobScheduler.java

@@ -81,7 +81,7 @@ public class JobScheduler {
     public void destroy() {
         final JobHelper jobHelper = ComponentUtil.getJobHelper();
         for (final String sessionId : jobHelper.getRunningSessionIdSet()) {
-            jobHelper.destroyCrawlerProcess(sessionId);
+            jobHelper.destroyProcess(sessionId);
         }
         try {
             scheduler.shutdown(true);

+ 6 - 7
src/main/java/org/codelibs/fess/job/SuggestJob.java

@@ -102,7 +102,7 @@ public class SuggestJob {
         }
         resultBuf.append("Session Id: ").append(sessionId).append("\n");
         if (jobExecutor != null) {
-            jobExecutor.addShutdownListener(() -> ComponentUtil.getJobHelper().destroyCrawlerProcess(sessionId));
+            jobExecutor.addShutdownListener(() -> ComponentUtil.getJobHelper().destroyProcess(sessionId));
         }
 
         try {
@@ -224,12 +224,11 @@ public class SuggestJob {
             logger.info("SuggestCreator: \nDirectory=" + baseDir + "\nOptions=" + cmdList);
         }
 
-        final ProcessBuilder pb = new ProcessBuilder(cmdList);
-        pb.directory(baseDir);
-        pb.redirectErrorStream(true);
-
         try {
-            final JobProcess jobProcess = jobHelper.startCrawlerProcess(sessionId, pb);
+            final JobProcess jobProcess = jobHelper.startProcess(sessionId, cmdList, pb -> {
+                pb.directory(baseDir);
+                pb.redirectErrorStream(true);
+            });
 
             final InputStreamThread it = jobProcess.getInputStreamThread();
             it.start();
@@ -254,7 +253,7 @@ public class SuggestJob {
             throw new FessSystemException("SuggestCreator Process terminated.", e);
         } finally {
             try {
-                jobHelper.destroyCrawlerProcess(sessionId);
+                jobHelper.destroyProcess(sessionId);
             } finally {
                 deleteTempDir(ownTmpDir);
             }