org.quartz.plugins.history.LoggingTriggerHistoryPlugin Maven / Gradle / Ivy
Go to download
SDK for dev_appserver (local development) with some of the dependencies shaded (repackaged)
/*
* Copyright 2004-2005 OpenSymphony
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
/*
* Previously Copyright (c) 2001-2004 James House
*/
package org.quartz.plugins.history;
import java.text.MessageFormat;
import com.google.appengine.repackaged.org.apache.commons.logging.Log;
import com.google.appengine.repackaged.org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerListener;
import org.quartz.spi.SchedulerPlugin;
/**
* Logs a history of all trigger firings via the Jakarta Commons-Logging
* framework.
*
*
* The logged message is customizable by setting one of the following message
* properties to a String that conforms to the syntax of java.util.MessageFormat
.
*
*
*
* TriggerFiredMessage - available message data are:
*
* Element
* Data Type
* Description
*
*
* 0
* String
* The Trigger's Name.
*
*
* 1
* String
* The Trigger's Group.
*
*
* 2
* Date
* The scheduled fire time.
*
*
* 3
* Date
* The next scheduled fire time.
*
*
* 4
* Date
* The actual fire time.
*
*
* 5
* String
* The Job's name.
*
*
* 6
* String
* The Job's group.
*
*
* 7
* Integer
* The re-fire count from the JobExecutionContext.
*
*
*
* The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4,
* date, HH:mm:ss MM/dd/yyyy}"
*
*
*
* TriggerMisfiredMessage - available message data are:
*
* Element
* Data Type
* Description
*
*
* 0
* String
* The Trigger's Name.
*
*
* 1
* String
* The Trigger's Group.
*
*
* 2
* Date
* The scheduled fire time.
*
*
* 3
* Date
* The next scheduled fire time.
*
*
* 4
* Date
* The actual fire time. (the time the misfire was detected/handled)
*
*
* 5
* String
* The Job's name.
*
*
* 6
* String
* The Job's group.
*
*
*
* The default message text is "Trigger {1}.{0} misfired job {6}.{5} at:
* {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss
* MM/dd/yyyy}"
*
*
*
* TriggerCompleteMessage - available message data are:
*
* Element
* Data Type
* Description
*
*
* 0
* String
* The Trigger's Name.
*
*
* 1
* String
* The Trigger's Group.
*
*
* 2
* Date
* The scheduled fire time.
*
*
* 3
* Date
* The next scheduled fire time.
*
*
* 4
* Date
* The job completion time.
*
*
* 5
* String
* The Job's name.
*
*
* 6
* String
* The Job's group.
*
*
* 7
* Integer
* The re-fire count from the JobExecutionContext.
*
*
* 8
* Integer
* The trigger's resulting instruction code.
*
*
* 9
* String
* A human-readable translation of the trigger's resulting instruction
* code.
*
*
*
* The default message text is "Trigger {1}.{0} completed firing job
* {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction
* code: {9}"
*
*
* @author James House
*/
public class LoggingTriggerHistoryPlugin implements SchedulerPlugin,
TriggerListener {
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Data members.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
private String name;
private String triggerFiredMessage = "Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}";
private String triggerMisfiredMessage = "Trigger {1}.{0} misfired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss MM/dd/yyyy}";
private String triggerCompleteMessage = "Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}";
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Constructors.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
public LoggingTriggerHistoryPlugin() {
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Interface.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
protected Log getLog() {
return LogFactory.getLog(LoggingTriggerHistoryPlugin.class);
}
/**
* Get the message that is printed upon the completion of a trigger's
* firing.
*
* @return String
*/
public String getTriggerCompleteMessage() {
return triggerCompleteMessage;
}
/**
* Get the message that is printed upon a trigger's firing.
*
* @return String
*/
public String getTriggerFiredMessage() {
return triggerFiredMessage;
}
/**
* Get the message that is printed upon a trigger's mis-firing.
*
* @return String
*/
public String getTriggerMisfiredMessage() {
return triggerMisfiredMessage;
}
/**
* Set the message that is printed upon the completion of a trigger's
* firing.
*
* @param triggerCompleteMessage
* String in java.text.MessageFormat syntax.
*/
public void setTriggerCompleteMessage(String triggerCompleteMessage) {
this.triggerCompleteMessage = triggerCompleteMessage;
}
/**
* Set the message that is printed upon a trigger's firing.
*
* @param triggerFiredMessage
* String in java.text.MessageFormat syntax.
*/
public void setTriggerFiredMessage(String triggerFiredMessage) {
this.triggerFiredMessage = triggerFiredMessage;
}
/**
* Set the message that is printed upon a trigger's firing.
*
* @param triggerMisfiredMessage
* String in java.text.MessageFormat syntax.
*/
public void setTriggerMisfiredMessage(String triggerMisfiredMessage) {
this.triggerMisfiredMessage = triggerMisfiredMessage;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* SchedulerPlugin Interface.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
/**
*
* Called during creation of the Scheduler
in order to give
* the SchedulerPlugin
a chance to initialize.
*
*
* @throws SchedulerConfigException
* if there is an error initializing.
*/
public void initialize(String name, Scheduler scheduler)
throws SchedulerException {
this.name = name;
scheduler.addGlobalTriggerListener(this);
}
public void start() {
// do nothing...
}
/**
*
* Called in order to inform the SchedulerPlugin
that it
* should free up all of it's resources because the scheduler is shutting
* down.
*
*/
public void shutdown() {
// nothing to do...
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* TriggerListener Interface.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
/*
* Object[] arguments = { new Integer(7), new
* Date(System.currentTimeMillis()), "a disturbance in the Force" };
*
* String result = MessageFormat.format( "At {1,time} on {1,date}, there
* was {2} on planet {0,number,integer}.", arguments);
*/
public String getName() {
return name;
}
public void triggerFired(Trigger trigger, JobExecutionContext context) {
if (!getLog().isInfoEnabled()) {
return;
}
Object[] args = {trigger.getName(), trigger.getGroup(),
trigger.getPreviousFireTime(), trigger.getNextFireTime(),
new java.util.Date(), context.getJobDetail().getName(),
context.getJobDetail().getGroup(),
new Integer(context.getRefireCount())};
getLog().info(MessageFormat.format(getTriggerFiredMessage(), args));
}
public void triggerMisfired(Trigger trigger) {
if (!getLog().isInfoEnabled()) {
return;
}
Object[] args = {trigger.getName(), trigger.getGroup(),
trigger.getPreviousFireTime(), trigger.getNextFireTime(),
new java.util.Date(), trigger.getJobGroup(),
trigger.getJobGroup(),};
getLog().info(MessageFormat.format(getTriggerMisfiredMessage(), args));
}
public void triggerComplete(Trigger trigger, JobExecutionContext context,
int triggerInstructionCode) {
if (!getLog().isInfoEnabled()) {
return;
}
String instrCode = "UNKNOWN";
if (triggerInstructionCode == Trigger.INSTRUCTION_DELETE_TRIGGER) instrCode = "DELETE TRIGGER";
else if (triggerInstructionCode == Trigger.INSTRUCTION_NOOP) instrCode = "DO NOTHING";
else if (triggerInstructionCode == Trigger.INSTRUCTION_RE_EXECUTE_JOB) instrCode = "RE-EXECUTE JOB";
else if (triggerInstructionCode == Trigger.INSTRUCTION_SET_ALL_JOB_TRIGGERS_COMPLETE) instrCode = "SET ALL OF JOB'S TRIGGERS COMPLETE";
else if (triggerInstructionCode == Trigger.INSTRUCTION_SET_TRIGGER_COMPLETE)
instrCode = "SET THIS TRIGGER COMPLETE";
Object[] args = {trigger.getName(), trigger.getGroup(),
trigger.getPreviousFireTime(), trigger.getNextFireTime(),
new java.util.Date(), context.getJobDetail().getName(),
context.getJobDetail().getGroup(),
new Integer(context.getRefireCount()),
new Integer(triggerInstructionCode), instrCode};
getLog().info(MessageFormat.format(getTriggerCompleteMessage(), args));
}
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
return false;
}
}