diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java index bc7bab7d4..af2d487a9 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java +++ b/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(); } // =================================================================================== diff --git a/src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java b/src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java index 0e7d07569..f76cdc95c 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java +++ b/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 scheduledJobList = scheduledJobService.getCrawlerJobList(); for (final ScheduledJob scheduledJob : scheduledJobList) { new Thread(() -> new TriggeredJob().execute(scheduledJob)).start(); diff --git a/src/main/java/org/codelibs/fess/helper/JobHelper.java b/src/main/java/org/codelibs/fess/helper/JobHelper.java index 850d92934..a6585cc94 100644 --- a/src/main/java/org/codelibs/fess/helper/JobHelper.java +++ b/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 cmdList, Consumer 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); } + } diff --git a/src/main/java/org/codelibs/fess/job/CrawlJob.java b/src/main/java/org/codelibs/fess/job/CrawlJob.java index eca9e7f28..1e54ea839 100644 --- a/src/main/java/org/codelibs/fess/job/CrawlJob.java +++ b/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); } diff --git a/src/main/java/org/codelibs/fess/job/JobScheduler.java b/src/main/java/org/codelibs/fess/job/JobScheduler.java index 084dada51..28bd42d63 100644 --- a/src/main/java/org/codelibs/fess/job/JobScheduler.java +++ b/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); diff --git a/src/main/java/org/codelibs/fess/job/SuggestJob.java b/src/main/java/org/codelibs/fess/job/SuggestJob.java index a8bd02a56..671155da7 100644 --- a/src/main/java/org/codelibs/fess/job/SuggestJob.java +++ b/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); }