diff --git a/src/main/config/es/fess_config.json b/src/main/config/es/fess_config.json index af70deaba..13cd8a5da 100644 --- a/src/main/config/es/fess_config.json +++ b/src/main/config/es/fess_config.json @@ -152,6 +152,9 @@ "target" : { "type" : "string", "index" : "not_analyzed" + }, + "lastUpdated" : { + "type" : "long" } } }, diff --git a/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java b/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java index aaaedafea..0506f4479 100644 --- a/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java +++ b/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java @@ -16,6 +16,7 @@ package org.codelibs.fess.app.job; import org.codelibs.core.lang.StringUtil; +import org.codelibs.core.timer.TimeoutTask; import org.codelibs.fess.Constants; import org.codelibs.fess.es.config.exentity.JobLog; import org.codelibs.fess.es.config.exentity.ScheduledJob; @@ -74,9 +75,11 @@ public class ScriptExecutorJob implements LaJob { return; } + TimeoutTask task = null; try { if (scheduledJob.isLoggingEnabled()) { jobHelper.store(jobLog); + task = jobHelper.startMonitorTask(jobLog); } if (logger.isDebugEnabled()) { @@ -102,6 +105,13 @@ public class ScriptExecutorJob implements LaJob { jobLog.setJobStatus(Constants.FAIL); jobLog.setScriptResult(systemHelper.abbreviateLongText(t.getLocalizedMessage())); } finally { + if (task != null) { + try { + task.stop(); + } catch (Exception e) { + logger.warn("Failed to stop " + jobLog, e); + } + } jobLog.setEndTime(ComponentUtil.getSystemHelper().getCurrentTimeAsLong()); if (logger.isDebugEnabled()) { logger.debug("jobLog: " + jobLog); diff --git a/src/main/java/org/codelibs/fess/es/config/bsbhv/BsJobLogBhv.java b/src/main/java/org/codelibs/fess/es/config/bsbhv/BsJobLogBhv.java index 75ce7bb39..1225bf193 100644 --- a/src/main/java/org/codelibs/fess/es/config/bsbhv/BsJobLogBhv.java +++ b/src/main/java/org/codelibs/fess/es/config/bsbhv/BsJobLogBhv.java @@ -81,6 +81,7 @@ public abstract class BsJobLogBhv extends EsAbstractBehavior { result.setScriptType(DfTypeUtil.toString(source.get("scriptType"))); result.setStartTime(DfTypeUtil.toLong(source.get("startTime"))); result.setTarget(DfTypeUtil.toString(source.get("target"))); + result.setLastUpdated(DfTypeUtil.toLong(source.get("lastUpdated"))); return result; } catch (InstantiationException | IllegalAccessException e) { final String msg = "Cannot create a new instance: " + entityType.getName(); diff --git a/src/main/java/org/codelibs/fess/es/config/bsentity/BsJobLog.java b/src/main/java/org/codelibs/fess/es/config/bsentity/BsJobLog.java index 3be4025c1..0584e93ff 100644 --- a/src/main/java/org/codelibs/fess/es/config/bsentity/BsJobLog.java +++ b/src/main/java/org/codelibs/fess/es/config/bsentity/BsJobLog.java @@ -61,6 +61,9 @@ public class BsJobLog extends EsAbstractEntity { /** target */ protected String target; + /** lastUpdated */ + protected Long lastUpdated; + // [Referrers] *comment only // =================================================================================== @@ -106,6 +109,9 @@ public class BsJobLog extends EsAbstractEntity { if (target != null) { sourceMap.put("target", target); } + if (lastUpdated != null) { + sourceMap.put("lastUpdated", lastUpdated); + } return sourceMap; } @@ -123,6 +129,7 @@ public class BsJobLog extends EsAbstractEntity { sb.append(dm).append(scriptType); sb.append(dm).append(startTime); sb.append(dm).append(target); + sb.append(dm).append(lastUpdated); if (sb.length() > dm.length()) { sb.delete(0, dm.length()); } @@ -212,4 +219,14 @@ public class BsJobLog extends EsAbstractEntity { registerModifiedProperty("target"); this.target = value; } + + public Long getLastUpdated() { + checkSpecifiedProperty("lastUpdated"); + return lastUpdated; + } + + public void setLastUpdated(Long value) { + registerModifiedProperty("lastUpdated"); + this.lastUpdated = value; + } } diff --git a/src/main/java/org/codelibs/fess/es/config/bsentity/dbmeta/JobLogDbm.java b/src/main/java/org/codelibs/fess/es/config/bsentity/dbmeta/JobLogDbm.java index 02e22eafd..157a3cb6c 100644 --- a/src/main/java/org/codelibs/fess/es/config/bsentity/dbmeta/JobLogDbm.java +++ b/src/main/java/org/codelibs/fess/es/config/bsentity/dbmeta/JobLogDbm.java @@ -90,6 +90,8 @@ public class JobLogDbm extends AbstractDBMeta { "scriptType"); setupEpg(_epgMap, et -> ((JobLog) et).getStartTime(), (et, vl) -> ((JobLog) et).setStartTime(DfTypeUtil.toLong(vl)), "startTime"); setupEpg(_epgMap, et -> ((JobLog) et).getTarget(), (et, vl) -> ((JobLog) et).setTarget(DfTypeUtil.toString(vl)), "target"); + setupEpg(_epgMap, et -> ((JobLog) et).getLastUpdated(), (et, vl) -> ((JobLog) et).setLastUpdated(DfTypeUtil.toLong(vl)), + "lastUpdated"); } @Override @@ -142,6 +144,8 @@ public class JobLogDbm extends AbstractDBMeta { false, "Long", 0, 0, null, false, null, null, null, null, null, false); protected final ColumnInfo _columnTarget = cci("target", "target", null, null, String.class, "target", null, false, false, false, "String", 0, 0, null, false, null, null, null, null, null, false); + protected final ColumnInfo _columnLastUpdated = cci("lastUpdated", "lastUpdated", null, null, Long.class, "lastUpdated", null, false, + false, false, "Long", 0, 0, null, false, null, null, null, null, null, false); public ColumnInfo columnEndTime() { return _columnEndTime; @@ -175,6 +179,10 @@ public class JobLogDbm extends AbstractDBMeta { return _columnTarget; } + public ColumnInfo columnLastUpdated() { + return _columnLastUpdated; + } + protected List ccil() { List ls = newArrayList(); ls.add(columnEndTime()); @@ -185,6 +193,7 @@ public class JobLogDbm extends AbstractDBMeta { ls.add(columnScriptType()); ls.add(columnStartTime()); ls.add(columnTarget()); + ls.add(columnLastUpdated()); return ls; } diff --git a/src/main/java/org/codelibs/fess/es/config/cbean/bs/BsJobLogCB.java b/src/main/java/org/codelibs/fess/es/config/cbean/bs/BsJobLogCB.java index b7d4e4abb..cf76ba0e5 100644 --- a/src/main/java/org/codelibs/fess/es/config/cbean/bs/BsJobLogCB.java +++ b/src/main/java/org/codelibs/fess/es/config/cbean/bs/BsJobLogCB.java @@ -178,5 +178,9 @@ public class BsJobLogCB extends EsAbstractConditionBean { public void columnTarget() { doColumn("target"); } + + public void columnLastUpdated() { + doColumn("lastUpdated"); + } } } diff --git a/src/main/java/org/codelibs/fess/es/config/cbean/cq/bs/BsJobLogCQ.java b/src/main/java/org/codelibs/fess/es/config/cbean/cq/bs/BsJobLogCQ.java index 026620330..af0f01cbc 100644 --- a/src/main/java/org/codelibs/fess/es/config/cbean/cq/bs/BsJobLogCQ.java +++ b/src/main/java/org/codelibs/fess/es/config/cbean/cq/bs/BsJobLogCQ.java @@ -1440,4 +1440,156 @@ public abstract class BsJobLogCQ extends EsAbstractConditionQuery { return this; } + public void setLastUpdated_Equal(Long lastUpdated) { + setLastUpdated_Term(lastUpdated, null); + } + + public void setLastUpdated_Equal(Long lastUpdated, ConditionOptionCall opLambda) { + setLastUpdated_Term(lastUpdated, opLambda); + } + + public void setLastUpdated_Term(Long lastUpdated) { + setLastUpdated_Term(lastUpdated, null); + } + + public void setLastUpdated_Term(Long lastUpdated, ConditionOptionCall opLambda) { + TermQueryBuilder builder = regTermQ("lastUpdated", lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_NotEqual(Long lastUpdated) { + setLastUpdated_NotTerm(lastUpdated, null); + } + + public void setLastUpdated_NotTerm(Long lastUpdated) { + setLastUpdated_NotTerm(lastUpdated, null); + } + + public void setLastUpdated_NotEqual(Long lastUpdated, ConditionOptionCall opLambda) { + setLastUpdated_NotTerm(lastUpdated, opLambda); + } + + public void setLastUpdated_NotTerm(Long lastUpdated, ConditionOptionCall opLambda) { + not(not -> not.setLastUpdated_Term(lastUpdated), opLambda); + } + + public void setLastUpdated_Terms(Collection lastUpdatedList) { + setLastUpdated_Terms(lastUpdatedList, null); + } + + public void setLastUpdated_Terms(Collection lastUpdatedList, ConditionOptionCall opLambda) { + TermsQueryBuilder builder = regTermsQ("lastUpdated", lastUpdatedList); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_InScope(Collection lastUpdatedList) { + setLastUpdated_Terms(lastUpdatedList, null); + } + + public void setLastUpdated_InScope(Collection lastUpdatedList, ConditionOptionCall opLambda) { + setLastUpdated_Terms(lastUpdatedList, opLambda); + } + + public void setLastUpdated_Match(Long lastUpdated) { + setLastUpdated_Match(lastUpdated, null); + } + + public void setLastUpdated_Match(Long lastUpdated, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchQ("lastUpdated", lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_MatchPhrase(Long lastUpdated) { + setLastUpdated_MatchPhrase(lastUpdated, null); + } + + public void setLastUpdated_MatchPhrase(Long lastUpdated, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchPhraseQ("lastUpdated", lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_MatchPhrasePrefix(Long lastUpdated) { + setLastUpdated_MatchPhrasePrefix(lastUpdated, null); + } + + public void setLastUpdated_MatchPhrasePrefix(Long lastUpdated, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchPhrasePrefixQ("lastUpdated", lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_Fuzzy(Long lastUpdated) { + setLastUpdated_Fuzzy(lastUpdated, null); + } + + public void setLastUpdated_Fuzzy(Long lastUpdated, ConditionOptionCall opLambda) { + FuzzyQueryBuilder builder = regFuzzyQ("lastUpdated", lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_GreaterThan(Long lastUpdated) { + setLastUpdated_GreaterThan(lastUpdated, null); + } + + public void setLastUpdated_GreaterThan(Long lastUpdated, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("lastUpdated", ConditionKey.CK_GREATER_THAN, lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_LessThan(Long lastUpdated) { + setLastUpdated_LessThan(lastUpdated, null); + } + + public void setLastUpdated_LessThan(Long lastUpdated, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("lastUpdated", ConditionKey.CK_LESS_THAN, lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_GreaterEqual(Long lastUpdated) { + setLastUpdated_GreaterEqual(lastUpdated, null); + } + + public void setLastUpdated_GreaterEqual(Long lastUpdated, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("lastUpdated", ConditionKey.CK_GREATER_EQUAL, lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setLastUpdated_LessEqual(Long lastUpdated) { + setLastUpdated_LessEqual(lastUpdated, null); + } + + public void setLastUpdated_LessEqual(Long lastUpdated, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("lastUpdated", ConditionKey.CK_LESS_EQUAL, lastUpdated); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public BsJobLogCQ addOrderBy_LastUpdated_Asc() { + regOBA("lastUpdated"); + return this; + } + + public BsJobLogCQ addOrderBy_LastUpdated_Desc() { + regOBD("lastUpdated"); + return this; + } + } diff --git a/src/main/java/org/codelibs/fess/es/config/exentity/JobLog.java b/src/main/java/org/codelibs/fess/es/config/exentity/JobLog.java index 42188589b..4521e8eb1 100644 --- a/src/main/java/org/codelibs/fess/es/config/exentity/JobLog.java +++ b/src/main/java/org/codelibs/fess/es/config/exentity/JobLog.java @@ -38,6 +38,7 @@ public class JobLog extends BsJobLog { setScriptType(scheduledJob.getScriptType()); setScriptData(scheduledJob.getScriptData()); setStartTime(ComponentUtil.getSystemHelper().getCurrentTimeAsLong()); + setLastUpdated(ComponentUtil.getSystemHelper().getCurrentTimeAsLong()); setJobStatus(Constants.RUNNING); final String myName = ComponentUtil.getFessConfig().getSchedulerTargetName(); setTarget(StringUtil.isNotBlank(myName) ? myName : Constants.DEFAULT_JOB_TARGET); diff --git a/src/main/java/org/codelibs/fess/helper/JobHelper.java b/src/main/java/org/codelibs/fess/helper/JobHelper.java index d84130f94..7652a726b 100644 --- a/src/main/java/org/codelibs/fess/helper/JobHelper.java +++ b/src/main/java/org/codelibs/fess/helper/JobHelper.java @@ -19,6 +19,9 @@ import java.util.HashMap; import java.util.Map; import org.codelibs.core.lang.StringUtil; +import org.codelibs.core.timer.TimeoutManager; +import org.codelibs.core.timer.TimeoutTarget; +import org.codelibs.core.timer.TimeoutTask; import org.codelibs.fess.Constants; import org.codelibs.fess.es.config.exbhv.JobLogBhv; import org.codelibs.fess.es.config.exbhv.ScheduledJobBhv; @@ -38,6 +41,7 @@ import org.slf4j.LoggerFactory; public class JobHelper { private static final Logger logger = LoggerFactory.getLogger(JobHelper.class); + private int monitorInterval = 60 * 60;// 1hour public void register(final ScheduledJob scheduledJob) { final JobManager jobManager = ComponentUtil.getJobManager(); @@ -132,4 +136,36 @@ public class JobHelper { }); } + public TimeoutTask startMonitorTask(final JobLog jobLog) { + TimeoutTarget target = new MonitorTarget(jobLog); + return TimeoutManager.getInstance().addTimeoutTarget(target, monitorInterval, true); + } + + public void setMonitorInterval(int monitorInterval) { + this.monitorInterval = monitorInterval; + } + + static class MonitorTarget implements TimeoutTarget { + + private JobLog jobLog; + + public MonitorTarget(final JobLog jobLog) { + this.jobLog = jobLog; + } + + @Override + public void expired() { + if (jobLog.getEndTime() == null) { + jobLog.setLastUpdated(ComponentUtil.getSystemHelper().getCurrentTimeAsLong()); + if (logger.isDebugEnabled()) { + logger.debug("Update " + jobLog); + } + ComponentUtil.getComponent(JobLogBhv.class).insertOrUpdate(jobLog, op -> { + op.setRefresh(true); + }); + } + } + + } + } diff --git a/src/main/resources/fess_indices/.fess_config/job_log.json b/src/main/resources/fess_indices/.fess_config/job_log.json index 1f8fc35ba..7af56c48c 100644 --- a/src/main/resources/fess_indices/.fess_config/job_log.json +++ b/src/main/resources/fess_indices/.fess_config/job_log.json @@ -31,6 +31,9 @@ "type": "string", "index": "not_analyzed" }, + "lastUpdated": { + "type": "long" + }, "startTime": { "type": "long" },