synchronize process builder

This commit is contained in:
Shinsuke Sugaya 2016-01-01 14:57:01 +09:00
parent b04227304f
commit 9b6d0e5248
6 changed files with 31 additions and 28 deletions

View file

@ -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();
}
// ===================================================================================

View file

@ -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();

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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);

View file

@ -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);
}