package railo.runtime.spooler; import railo.commons.lang.ExceptionUtil; import railo.runtime.config.Config; import railo.runtime.exp.PageException; import railo.runtime.op.Caster; import railo.runtime.type.Array; import railo.runtime.type.ArrayImpl; import railo.runtime.type.Struct; import railo.runtime.type.StructImpl; public abstract class SpoolerTaskSupport implements SpoolerTask { private long creation; private long lastExecution; private int tries=0; private long nextExecution; private Array exceptions=new ArrayImpl(); private boolean closed; private String id; private ExecutionPlan[] plans; /** * Constructor of the class * @param plans * @param timeOffset offset from the local time to the config time */ public SpoolerTaskSupport(ExecutionPlan[] plans) { this.plans=plans; creation=System.currentTimeMillis(); } public final String getId() { return id; } public final void setId(String id) { this.id= id; } /** * return last execution of this task * @return last execution */ public final long lastExecution() { return lastExecution; } public final void setNextExecution(long nextExecution) { this.nextExecution=nextExecution; } public final long nextExecution() { return nextExecution; } /** * returns how many tries to send are already done * @return tries */ public final int tries() { return tries; } final void _execute(Config config) throws PageException { lastExecution=System.currentTimeMillis(); tries++; try { execute(config); } catch(Throwable t) { PageException pe = Caster.toPageException(t); String st = ExceptionUtil.getStacktrace(t,true); //config.getErrWriter().write(st+"\n"); Struct sct=new StructImpl(); sct.setEL("message", pe.getMessage()); sct.setEL("detail", pe.getDetail()); sct.setEL("stacktrace", st); sct.setEL("time", Caster.toLong(System.currentTimeMillis())); exceptions.appendEL(sct); throw pe; } finally { lastExecution=System.currentTimeMillis(); } } /** * @return the exceptions */ public final Array getExceptions() { return exceptions; } public final void setClosed(boolean closed) { this.closed=closed; } public final boolean closed() { return closed; } /** * @return the plans */ public ExecutionPlan[] getPlans() { return plans; } /** * @return the creation */ public long getCreation() { return creation; } public void setLastExecution(long lastExecution) { this.lastExecution=lastExecution; } }