Browse Source

#644 add lastUpdated to job_log

Shinsuke Sugaya 8 years ago
parent
commit
2abf3fad4a

+ 3 - 0
src/main/config/es/fess_config.json

@@ -152,6 +152,9 @@
           "target" : {
             "type" : "string",
             "index" : "not_analyzed"
+          },
+          "lastUpdated" : {
+            "type" : "long"
           }
         }
       },

+ 10 - 0
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);

+ 1 - 0
src/main/java/org/codelibs/fess/es/config/bsbhv/BsJobLogBhv.java

@@ -81,6 +81,7 @@ public abstract class BsJobLogBhv extends EsAbstractBehavior<JobLog, JobLogCB> {
             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();

+ 17 - 0
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;
+    }
 }

+ 9 - 0
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<ColumnInfo> ccil() {
         List<ColumnInfo> 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;
     }
 

+ 4 - 0
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");
+        }
     }
 }

+ 152 - 0
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<TermQueryBuilder> opLambda) {
+        setLastUpdated_Term(lastUpdated, opLambda);
+    }
+
+    public void setLastUpdated_Term(Long lastUpdated) {
+        setLastUpdated_Term(lastUpdated, null);
+    }
+
+    public void setLastUpdated_Term(Long lastUpdated, ConditionOptionCall<TermQueryBuilder> 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<BoolQueryBuilder> opLambda) {
+        setLastUpdated_NotTerm(lastUpdated, opLambda);
+    }
+
+    public void setLastUpdated_NotTerm(Long lastUpdated, ConditionOptionCall<BoolQueryBuilder> opLambda) {
+        not(not -> not.setLastUpdated_Term(lastUpdated), opLambda);
+    }
+
+    public void setLastUpdated_Terms(Collection<Long> lastUpdatedList) {
+        setLastUpdated_Terms(lastUpdatedList, null);
+    }
+
+    public void setLastUpdated_Terms(Collection<Long> lastUpdatedList, ConditionOptionCall<TermsQueryBuilder> opLambda) {
+        TermsQueryBuilder builder = regTermsQ("lastUpdated", lastUpdatedList);
+        if (opLambda != null) {
+            opLambda.callback(builder);
+        }
+    }
+
+    public void setLastUpdated_InScope(Collection<Long> lastUpdatedList) {
+        setLastUpdated_Terms(lastUpdatedList, null);
+    }
+
+    public void setLastUpdated_InScope(Collection<Long> lastUpdatedList, ConditionOptionCall<TermsQueryBuilder> opLambda) {
+        setLastUpdated_Terms(lastUpdatedList, opLambda);
+    }
+
+    public void setLastUpdated_Match(Long lastUpdated) {
+        setLastUpdated_Match(lastUpdated, null);
+    }
+
+    public void setLastUpdated_Match(Long lastUpdated, ConditionOptionCall<MatchQueryBuilder> 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<MatchQueryBuilder> 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<MatchQueryBuilder> 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<FuzzyQueryBuilder> 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<RangeQueryBuilder> 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<RangeQueryBuilder> 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<RangeQueryBuilder> 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<RangeQueryBuilder> 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;
+    }
+
 }

+ 1 - 0
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);

+ 36 - 0
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);
+                });
+            }
+        }
+
+    }
+
 }

+ 3 - 0
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"
       },