diff --git a/pom.xml b/pom.xml
index 8479c2723f023d6cd17100ab20aca5efe8d085e7..5f52030502fc2fcce98de1f9e011065d92cab63c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,9 +41,9 @@
<!-- Main Framework -->
<dbflute.version>1.1.1</dbflute.version>
- <lastaflute.version>0.7.9-RC2</lastaflute.version>
+ <lastaflute.version>0.7.9-RC4</lastaflute.version>
<lasta.taglib.version>0.6.8</lasta.taglib.version>
- <lasta.job.version>0.2.0-RCB</lasta.job.version>
+ <lasta.job.version>0.2.0-RCC</lasta.job.version>
<servlet.version>3.1.0</servlet.version>
<jsp.version>2.3.1</jsp.version>
<mailflute.version>0.4.8</mailflute.version>
diff --git a/src/main/java/org/codelibs/fess/Constants.java b/src/main/java/org/codelibs/fess/Constants.java
index b2b4266e7b03a255def935449a89964215751fe3..7125b527cdf16675bb497a125c6034062e928afe 100644
--- a/src/main/java/org/codelibs/fess/Constants.java
+++ b/src/main/java/org/codelibs/fess/Constants.java
@@ -76,6 +76,8 @@ public class Constants extends CoreLibConstants {
public static final String DEFAULT_HOURLY_CRON_EXPRESSION = "0 * * * *";
+ public static final String UNSCHEDULE_CRON_EXPRESSION = "0 0 1 1 sun";
+
public static final int DEFAULT_INTERVAL_TIME_FOR_FS = 1000;
public static final int DEFAULT_INTERVAL_TIME_FOR_WEB = 30000;
diff --git a/src/main/java/org/codelibs/fess/app/job/AllJobScheduler.java b/src/main/java/org/codelibs/fess/app/job/AllJobScheduler.java
index edb7424089169151270d6d89a10c4a767e41c832..bf9305db22d4dff95b4ce330107384b309015d7b 100644
--- a/src/main/java/org/codelibs/fess/app/job/AllJobScheduler.java
+++ b/src/main/java/org/codelibs/fess/app/job/AllJobScheduler.java
@@ -27,18 +27,12 @@ import org.codelibs.fess.mylasta.direction.FessConfig;
import org.codelibs.fess.util.ComponentUtil;
import org.dbflute.optional.OptionalThing;
import org.lastaflute.core.time.TimeManager;
-import org.lastaflute.di.core.exception.TooManyRegistrationComponentException;
-import org.lastaflute.di.core.smart.hot.HotdeployUtil;
import org.lastaflute.job.LaCron;
import org.lastaflute.job.LaJob;
import org.lastaflute.job.LaJobRunner;
-import org.lastaflute.job.LaJobRuntime;
import org.lastaflute.job.LaJobScheduler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class AllJobScheduler implements LaJobScheduler {
- private static final Logger logger = LoggerFactory.getLogger(AllJobScheduler.class);
protected static final String APP_TYPE = "JOB";
@@ -75,25 +69,7 @@ public class AllJobScheduler implements LaJobScheduler {
@Override
public LaJobRunner createRunner() {
- return new LaJobRunner() {
- @Override
- protected boolean isSuppressHotdeploy() { // TODO workaround
- return true;
- }
-
- @Override
- protected void actuallyRun(Class<? extends LaJob> jobType, LaJobRuntime runtime) { // TODO workaround
- try {
- super.actuallyRun(jobType, runtime);
- } catch (TooManyRegistrationComponentException e) {
- if (HotdeployUtil.isHotdeploy()) {
- logger.warn("Failed to start job {}", jobType);
- } else {
- throw e;
- }
- }
- }
- }.useAccessContext(resource -> {
+ return new LaJobRunner().useAccessContext(resource -> {
return accessContextLogic.create(resource, () -> OptionalThing.empty(), () -> OptionalThing.empty(), () -> APP_TYPE);
});
}
diff --git a/src/main/java/org/codelibs/fess/app/service/ScheduledJobService.java b/src/main/java/org/codelibs/fess/app/service/ScheduledJobService.java
index c303f442bcd2ea1f2439855d9b58a9fab2691e5a..91bd7b84d2afa7a45c61a34cb481eb0ebcdfe361 100644
--- a/src/main/java/org/codelibs/fess/app/service/ScheduledJobService.java
+++ b/src/main/java/org/codelibs/fess/app/service/ScheduledJobService.java
@@ -39,6 +39,7 @@ import org.lastaflute.job.JobManager;
import org.lastaflute.job.LaCron;
import org.lastaflute.job.LaScheduledJob;
import org.lastaflute.job.key.LaJobUnique;
+import org.lastaflute.job.subsidiary.CronOpCall;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -142,32 +143,26 @@ public class ScheduledJobService implements Serializable {
return;
}
+ final String cronExpression;
if (StringUtil.isNotBlank(scheduledJob.getCronExpression())) {
logger.info("Starting Job " + id + ":" + scheduledJob.getName());
- findJobByUniqueOf(LaJobUnique.of(id)).ifPresent(job -> {
- job.reschedule(scheduledJob.getCronExpression(), option -> option.uniqueBy(id).changeNoticeLogToDebug().params(() -> {
- Map<String, Object> params = new HashMap<>();
- params.put(Constants.SCHEDULED_JOB, scheduledJob);
- return params;
- }));
- }).orElse(
- () -> {
- cron.register(scheduledJob.getCronExpression(), fessConfig.getSchedulerJobClassAsClass(),
- fessConfig.getSchedulerConcurrentExecModeAsEnum(), option -> option.uniqueBy(id).changeNoticeLogToDebug()
- .params(() -> {
- Map<String, Object> params = new HashMap<>();
- params.put(Constants.SCHEDULED_JOB, scheduledJob);
- return params;
- }));
- });
+ cronExpression = scheduledJob.getCronExpression();
} else {
logger.info("Inactive Job " + id + ":" + scheduledJob.getName());
- try {
- unregister(scheduledJob);
- } catch (final Exception e) {
- logger.debug("Failed to delete Job " + scheduledJob, e);
- }
+ cronExpression = Constants.UNSCHEDULE_CRON_EXPRESSION;
}
+ final CronOpCall opLambda = option -> option.uniqueBy(id).changeNoticeLogToDebug().params(() -> {
+ Map<String, Object> params = new HashMap<>();
+ params.put(Constants.SCHEDULED_JOB, scheduledJob);
+ return params;
+ });
+ findJobByUniqueOf(LaJobUnique.of(id)).ifPresent(job -> {
+ job.reschedule(cronExpression, opLambda);
+ }).orElse(
+ () -> {
+ cron.register(cronExpression, fessConfig.getSchedulerJobClassAsClass(),
+ fessConfig.getSchedulerConcurrentExecModeAsEnum(), opLambda);
+ });
}
private OptionalThing<LaScheduledJob> findJobByUniqueOf(LaJobUnique jobUnique) {
@@ -182,9 +177,11 @@ public class ScheduledJobService implements Serializable {
public void unregister(final ScheduledJob scheduledJob) {
try {
JobManager jobManager = ComponentUtil.getJobManager();
- jobManager.findJobByUniqueOf(LaJobUnique.of(scheduledJob.getId())).ifPresent(job -> {
- job.unschedule();
- }).orElse(() -> logger.debug("Job {} is not scheduled.", scheduledJob.getId()));
+ if (jobManager.isSchedulingDone()) {
+ jobManager.findJobByUniqueOf(LaJobUnique.of(scheduledJob.getId())).ifPresent(job -> {
+ job.unschedule();
+ }).orElse(() -> logger.debug("Job {} is not scheduled.", scheduledJob.getId()));
+ }
} catch (final Exception e) {
throw new ScheduledJobException("Failed to delete Job: " + scheduledJob, e);
}
@@ -217,6 +214,12 @@ public class ScheduledJobService implements Serializable {
cb.query().setAvailable_Equal(Constants.T);
cb.query().addOrderBy_SortOrder_Asc();
cb.query().addOrderBy_Name_Asc();
- }, scheduledJob -> register(cron, scheduledJob));
+ }, scheduledJob -> {
+ try {
+ register(cron, scheduledJob);
+ } catch (Exception e) {
+ logger.error("Failed to start Job " + scheduledJob.getId(), e);
+ }
+ });
}
}