public static CreateTriggerAction createFromJson(final Object obj) throws Exception { final Map<String, Object> jsonObj = (HashMap<String, Object>) obj; if (!jsonObj.get("type").equals(type)) { throw new Exception("Cannot create action of " + type + " from " + jsonObj.get("type")); } final String actionId = (String) jsonObj.get("actionId"); final Trigger trigger = Trigger.fromJson(jsonObj.get("trigger")); return new CreateTriggerAction(actionId, trigger); }
/** * TODO: Don't understand why we need synchronized here. */ @Override public synchronized void addTrigger(final Trigger t) throws TriggerLoaderException { logger.info("Inserting trigger " + t.toString() + " into db."); final SQLTransaction<Long> insertAndGetLastID = transOperator -> { transOperator.update(ADD_TRIGGER, DateTime.now().getMillis()); // This commit must be called in order to unlock trigger table and have last insert ID. transOperator.getConnection().commit(); return transOperator.getLastInsertId(); }; try { final long id = this.dbOperator.transaction(insertAndGetLastID); t.setTriggerId((int) id); updateTrigger(t); logger.info("uploaded trigger " + t.getDescription()); } catch (final SQLException ex) { logger.error("Adding Trigger " + t.getTriggerId() + " failed."); throw new TriggerLoaderException("trigger id is not properly created.", ex); } }
private void checkAllTriggers() throws TriggerManagerException { // sweep through the rest of them for (final Trigger t : this.triggers) { try { TriggerManager.this.scannerStage = "Checking for trigger " + t.getTriggerId(); if (t.getStatus().equals(TriggerStatus.READY)) { /** * Prior to this change, expiration condition should never be called though * we have some related code here. ExpireCondition used the same BasicTimeChecker * as triggerCondition do. As a consequence, we need to figure out a way to distinguish * the previous ExpireCondition and this commit's ExpireCondition. */ if (t.getExpireCondition().getExpression().contains("EndTimeChecker") && t .expireConditionMet()) { onTriggerPause(t); } else if (t.triggerConditionMet()) { onTriggerTrigger(t); } } if (t.getStatus().equals(TriggerStatus.EXPIRED) && t.getSource().equals("azkaban")) { removeTrigger(t); } else { t.updateNextCheckTime(); } } catch (final Throwable th) { //skip this trigger, moving on to the next one logger.error("Failed to process trigger with id : " + t, th); } } }
@Override public String toString() { return "Trigger Id: " + getTriggerId() + ", Description: " + getDescription(); }
@Override public List<Trigger> getTriggerUpdates(final String triggerSource, final long lastUpdateTime) throws TriggerManagerException { final List<Trigger> triggers = new ArrayList<>(); for (final Trigger t : triggerIdMap.values()) { if (t.getSource().equals(triggerSource) && t.getLastModifyTime() > lastUpdateTime) { triggers.add(t); } } return triggers; }
@Override public void updateTrigger(final Trigger t) throws TriggerLoaderException { logger.info("Updating trigger " + t.getTriggerId() + " into db."); t.setLastModifyTime(System.currentTimeMillis()); updateTrigger(t, this.defaultEncodingType); }
private Schedule triggerToSchedule(final Trigger t) throws ScheduleManagerException { t.getTriggerCondition().getCheckers()); final BasicTimeChecker endTimeChecker = getEndTimeChecker(t); final List<TriggerAction> actions = t.getActions(); ExecuteFlowAction act = null; for (final TriggerAction action : actions) { return new Schedule(t.getTriggerId(), act.getProjectId(), act.getProjectName(), act.getFlowName(), t.getStatus().toString(), triggerTimeChecker.getFirstCheckTime(), endTimeChecker == null ? Constants.DEFAULT_SCHEDULE_END_EPOCH_TIME triggerTimeChecker.getTimeZone(), triggerTimeChecker.getPeriod(), t.getLastModifyTime(), triggerTimeChecker.getNextCheckTime(), t.getSubmitTime(), t.getSubmitUser(), act.getExecutionOptions(), act.getSlaOptions(),
private void updateTrigger(final Trigger t, final EncodingType encType) throws TriggerLoaderException { final String json = JSONUtils.toJSON(t.toJson()); byte[] data = null; try { final byte[] stringData = json.getBytes("UTF-8"); data = stringData; if (encType == EncodingType.GZIP) { data = GZIPUtils.gzipBytes(stringData); } logger.debug( "NumChars: " + json.length() + " UTF-8:" + stringData.length + " Gzip:" + data.length); } catch (final IOException e) { logger.error("Trigger encoding fails", e); throw new TriggerLoaderException("Error encoding the trigger " + t.toString(), e); } try { final int updates = this.dbOperator .update(UPDATE_TRIGGER, t.getSource(), t.getLastModifyTime(), encType.getNumVal(), data, t.getTriggerId()); if (updates == 0) { throw new TriggerLoaderException("No trigger has been updated."); } } catch (final SQLException ex) { logger.error("Updating Trigger " + t.getTriggerId() + " failed."); throw new TriggerLoaderException("DB Trigger update failed. ", ex); } }
scannerStage = "Checking for trigger " + t.getTriggerId(); if(shouldSkip && t.getInfo() != null && t.getInfo().containsKey("monitored.finished.execution")) { int execId = Integer.valueOf((String) t.getInfo().get("monitored.finished.execution")); if(justFinishedFlows.containsKey(execId)) { logger.info("Monitored execution has finished. Checking trigger earlier " + t.getTriggerId()); shouldSkip = false; if(shouldSkip && t.getNextCheckTime() > now) { shouldSkip = false; logger.info("Skipping trigger" + t.getTriggerId() + " until " + t.getNextCheckTime()); logger.info("Checking trigger " + t.getTriggerId()); if(t.getStatus().equals(TriggerStatus.READY)) { if(t.triggerConditionMet()) { onTriggerTrigger(t); } else if (t.expireConditionMet()) { onTriggerExpire(t); if(t.getStatus().equals(TriggerStatus.EXPIRED) && t.getSource().equals("azkaban")) { removeTrigger(t); } else { t.updateNextCheckTime();
private void onTriggerTrigger(final Trigger t) throws TriggerManagerException { final List<TriggerAction> actions = t.getTriggerActions(); for (final TriggerAction action : actions) { try { if (t.isResetOnTrigger()) { t.resetTriggerConditions(); } else { logger.info("NextCheckTime did not change. Setting status to expired for trigger" + t.getTriggerId()); t.setStatus(TriggerStatus.EXPIRED);
final Object obj = t.toJson(); JSONUtils.toJSON(obj, temp); final Trigger t2 = Trigger.fromJson(JSONUtils.parseJSONFromFile(temp)); assertTrue(t.getSource().equals(t2.getSource())); assertTrue(t.getTriggerId() == t2.getTriggerId());
@Override public synchronized void addTrigger(final Trigger t) throws TriggerLoaderException { t.setTriggerId(this.triggerCount); t.setLastModifyTime(System.currentTimeMillis()); this.triggers.put(t.getTriggerId(), t); this.triggerCount++; }
.build(); trigger.setResetOnExpire(resetOnExpire); trigger.setResetOnTrigger(resetOnTrigger); trigger.setStatus(status); } catch (final Exception e) { e.printStackTrace();
public void updateTrigger(final Trigger t) throws TriggerManagerException { logger.info("Updating trigger " + t + " in TriggerManager"); synchronized (this.syncObj) { this.runnerThread.deleteTrigger(triggerIdMap.get(t.getTriggerId())); this.runnerThread.addTrigger(t); triggerIdMap.put(t.getTriggerId(), t); try { this.triggerLoader.updateTrigger(t); } catch (final TriggerLoaderException e) { throw new TriggerManagerException(e); } } }
private Schedule triggerToSchedule(Trigger t) throws ScheduleManagerException { Condition triggerCond = t.getTriggerCondition(); Map<String, ConditionChecker> checkers = triggerCond.getCheckers(); BasicTimeChecker ck = null; List<TriggerAction> actions = t.getActions(); ExecuteFlowAction act = null; for(TriggerAction action : actions) { t.getTriggerId(), act.getProjectId(), act.getProjectName(), act.getFlowName(), t.getStatus().toString(), ck.getFirstCheckTime(), ck.getTimeZone(),
private void onTriggerPause(final Trigger t) throws TriggerManagerException { final List<TriggerAction> expireActions = t.getExpireActions(); for (final TriggerAction action : expireActions) { try { logger.info("Doing expire actions for " + action.getDescription() + " for " + t); action.doAction(); } catch (final Exception e) { logger.error("Failed to do expire action " + action.getDescription() + " for " + t, e); } catch (final Throwable th) { logger.error("Failed to do expire action " + action.getDescription() + " for " + t, th); } } logger.info("Pausing Trigger " + t.getDescription()); t.setStatus(TriggerStatus.PAUSED); try { TriggerManager.this.triggerLoader.updateTrigger(t); } catch (final TriggerLoaderException e) { throw new TriggerManagerException(e); } }
trigger = new Trigger(triggerId, lastModifyTime, submitTime, submitUser, source, triggerCond, expireCond, actions, expireActions, info, context); trigger.setResetOnExpire(resetOnExpire); trigger.setResetOnTrigger(resetOnTrigger); trigger.setStatus(status); }catch(Exception e) { e.printStackTrace();
@Test public void timeCheckerAndExpireTriggerTest() throws TriggerManagerException { final long curr = System.currentTimeMillis(); final Trigger t1 = createPeriodAndEndCheckerTrigger(curr); this.triggerManager.insertTrigger(t1); t1.setResetOnTrigger(true); final BasicTimeChecker expireChecker = (BasicTimeChecker) t1.getExpireCondition().getCheckers().values() .toArray()[0]; sleep(1000); assertTrue(expireChecker.eval() == false); assertTrue(t1.getStatus() == TriggerStatus.READY); sleep(1000); sleep(1000); sleep(1000); assertTrue(expireChecker.eval() == true); assertTrue(t1.getStatus() == TriggerStatus.PAUSED); sleep(1000); assertTrue(expireChecker.eval() == true); assertTrue(t1.getStatus() == TriggerStatus.PAUSED); }
@Override public void insertSchedule(final Schedule s) throws ScheduleManagerException { final Trigger t = scheduleToTrigger(s); try { this.triggerManager.insertTrigger(t, t.getSubmitUser()); s.setScheduleId(t.getTriggerId()); } catch (final TriggerManagerException e) { throw new ScheduleManagerException("Failed to insert new schedule!", e); } }
public void removeTrigger(final Trigger t) throws TriggerManagerException { logger.info("Removing trigger " + t + " from TriggerManager"); synchronized (this.syncObj) { this.runnerThread.deleteTrigger(t); triggerIdMap.remove(t.getTriggerId()); try { t.stopCheckers(); this.triggerLoader.removeTrigger(t); } catch (final TriggerLoaderException e) { throw new TriggerManagerException(e); } } }