Improved cron management.

This commit is contained in:
Christian P. MOMON 2018-09-21 22:16:09 +02:00
parent d2a1f6b340
commit 1cd73061e7
6 changed files with 70 additions and 172 deletions

View File

@ -21,6 +21,7 @@ package org.april.hebdobot.bot;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException;
import java.time.LocalTime; import java.time.LocalTime;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -402,6 +403,10 @@ public class Hebdobot extends PircBot
{ {
throw new HebdobotException("Error in cron settings.", exception); throw new HebdobotException("Error in cron settings.", exception);
} }
catch (ParseException exception)
{
throw new HebdobotException(exception);
}
} }
/** /**

View File

@ -90,6 +90,7 @@ public class HebdobotConfigFile extends Properties
for (String notifyName : getNotifyNames()) for (String notifyName : getNotifyNames())
{ {
String notifyDescription = getNotifyCron(notifyName);
String notifyCron = getNotifyCron(notifyName); String notifyCron = getNotifyCron(notifyName);
String notifyIrcMessage = getNotifyIrcMessage(notifyName); String notifyIrcMessage = getNotifyIrcMessage(notifyName);
String notifyTwitterMessage = getNotifyTwitterMessage(notifyName); String notifyTwitterMessage = getNotifyTwitterMessage(notifyName);
@ -105,7 +106,7 @@ public class HebdobotConfigFile extends Properties
notifyImageFile = new File(notifyImageFileName); notifyImageFile = new File(notifyImageFileName);
} }
CronValue cronValue = new CronValue(notifyName, notifyCron, notifyIrcMessage, notifyTwitterMessage, notifyImageFile); CronValue cronValue = new CronValue(notifyName, notifyDescription, notifyCron, notifyIrcMessage, notifyTwitterMessage, notifyImageFile);
result.add(cronValue); result.add(cronValue);
} }

View File

@ -1,126 +0,0 @@
/**
* Copyright (C) 2011-2013,2017 Nicolas Vinot <aeris@imirhil.fr>
* Copyright (C) 2017 Christian Pierre MOMON <cmomon@april.org>
*
* This file is part of (April) Hebdobot.
*
* Hebdobot is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Hebdobot is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Hebdobot. If not, see <http://www.gnu.org/licenses/>
*/
package org.april.hebdobot.cron;
import org.apache.commons.lang3.StringUtils;
import org.april.hebdobot.bot.Hebdobot;
import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.Trigger.CompletedExecutionInstruction;
import org.quartz.TriggerListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class Job.
*/
public class CronListener implements TriggerListener
{
private static final Logger logger = LoggerFactory.getLogger(CronListener.class);
private CronValue cron;
private Hebdobot bot;
/**
* Instantiates a new cron listener.
*
* @param bot
* the bot
* @param cron
* the cron
*/
public CronListener(final Hebdobot bot, final CronValue cron)
{
if (cron == null)
{
throw new IllegalArgumentException("Null parameter cron.");
}
else if (bot == null)
{
throw new IllegalArgumentException("Null parameter bot.");
}
else
{
this.bot = bot;
this.cron = cron;
}
}
/* (non-Javadoc)
* @see org.quartz.TriggerListener#getName()
*/
@Override
public String getName()
{
return this.cron.getName();
}
/* (non-Javadoc)
* @see org.quartz.TriggerListener#triggerComplete(org.quartz.Trigger, org.quartz.JobExecutionContext, org.quartz.Trigger.CompletedExecutionInstruction)
*/
@Override
public void triggerComplete(final Trigger trigger, final JobExecutionContext context, final CompletedExecutionInstruction triggerInstructionCode)
{
}
/* (non-Javadoc)
* @see org.quartz.TriggerListener#triggerFired(org.quartz.Trigger, org.quartz.JobExecutionContext)
*/
@Override
public void triggerFired(final Trigger trigger, final JobExecutionContext context)
{
logger.info("CRON FIRE " + context.getTrigger().getDescription());
if (StringUtils.isBlank(this.cron.getIrcMessage()))
{
logger.info("No IRC message so no notify.");
}
else
{
this.bot.notifyIrc(this.cron.getIrcMessage());
}
if (StringUtils.isBlank(this.cron.getTwitterMessage()))
{
logger.info("No Twitter message so no notify.");
}
else
{
this.bot.notifyTwitter(this.cron.getTwitterMessage(), this.cron.getImageFile());
}
}
/* (non-Javadoc)
* @see org.quartz.TriggerListener#triggerMisfired(org.quartz.Trigger)
*/
@Override
public void triggerMisfired(final Trigger trigger)
{
}
/* (non-Javadoc)
* @see org.quartz.TriggerListener#vetoJobExecution(org.quartz.Trigger, org.quartz.JobExecutionContext)
*/
@Override
public boolean vetoJobExecution(final Trigger trigger, final JobExecutionContext context)
{
return false;
}
}

View File

@ -19,23 +19,15 @@
*/ */
package org.april.hebdobot.cron; package org.april.hebdobot.cron;
import java.util.Date; import java.text.ParseException;
import org.april.hebdobot.bot.Hebdobot; import org.april.hebdobot.bot.Hebdobot;
import org.quartz.CronScheduleBuilder; import org.quartz.JobDataMap;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler; import org.quartz.Scheduler;
import org.quartz.SchedulerException; import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.TriggerListener;
import org.quartz.impl.JobDetailImpl; import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher; import org.quartz.impl.triggers.CronTriggerImpl;
import org.quartz.impl.triggers.SimpleTriggerImpl;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -59,8 +51,9 @@ public class CronManager
* the crons * the crons
* @throws SchedulerException * @throws SchedulerException
* the scheduler exception * the scheduler exception
* @throws ParseException
*/ */
public CronManager(final Hebdobot bot, final CronSettings crons) throws SchedulerException public CronManager(final Hebdobot bot, final CronSettings crons) throws SchedulerException, ParseException
{ {
this.bot = bot; this.bot = bot;
this.crons = crons; this.crons = crons;
@ -70,6 +63,7 @@ public class CronManager
{ {
addCron(cron); addCron(cron);
} }
this.scheduler.start();
} }
/** /**
@ -79,41 +73,27 @@ public class CronManager
* the cron * the cron
* @throws SchedulerException * @throws SchedulerException
* the scheduler exception * the scheduler exception
* @throws ParseException
*/ */
public void addCron(final CronValue cron) throws SchedulerException public void addCron(final CronValue cron) throws SchedulerException, ParseException
{ {
{ {
final JobDetailImpl jobDetail = new JobDetailImpl(); final JobDetailImpl job = new JobDetailImpl();
jobDetail.setName("Mon job"); job.setName(cron.getName());
jobDetail.setJobClass(CronFooJob.class); job.setDescription(cron.getDescription());
job.setJobClass(NotifyJob.class);
JobDetail job = JobBuilder.newJob(CronFooJob.class).withIdentity(cron.getName()).build(); JobDataMap data = new JobDataMap();
data.put("bot", this.bot);
data.put("cron", cron);
job.setJobDataMap(data);
{ CronTriggerImpl trigger = new CronTriggerImpl();
final SimpleTriggerImpl trigger = new SimpleTriggerImpl(); trigger.setName(cron.getName());
trigger.setName("Trigger execution toutes les 5 secondes"); trigger.setDescription(cron.getDescription());
trigger.setDescription("Foo"); trigger.setCronExpression(cron.getCron());
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(5000);
}
{
TriggerBuilder<Trigger> builder = TriggerBuilder.newTrigger();
builder.withDescription(cron.getName());
builder.withIdentity(cron.getName());
builder.withSchedule(CronScheduleBuilder.cronSchedule(cron.getCron()));
Trigger trigger = builder.build();
}
}
{
Trigger trigger = TriggerBuilder.newTrigger().withDescription(cron.getName()).withIdentity(cron.getName())
.withSchedule(CronScheduleBuilder.cronSchedule(cron.getCron())).build();
JobDetail job = JobBuilder.newJob(CronFooJob.class).withIdentity(cron.getName()).build();
this.scheduler.scheduleJob(job, trigger); this.scheduler.scheduleJob(job, trigger);
TriggerListener listener = new CronListener(this.bot, cron);
this.scheduler.getListenerManager().addTriggerListener(listener, KeyMatcher.keyEquals(new TriggerKey(cron.getName())));
} }
logger.info("Added cron value: " + cron.getName()); logger.info("Added cron value: " + cron.getName());

View File

@ -26,6 +26,7 @@ import java.io.File;
public class CronValue public class CronValue
{ {
private String name; private String name;
private String description;
private String cron; private String cron;
private String ircMessage; private String ircMessage;
private String twitterMessage; private String twitterMessage;
@ -45,9 +46,11 @@ public class CronValue
* @param imageFile * @param imageFile
* the image file * the image file
*/ */
public CronValue(final String name, final String cron, final String ircMessage, final String twitterMessage, final File imageFile) public CronValue(final String name, final String description, final String cron, final String ircMessage, final String twitterMessage,
final File imageFile)
{ {
this.name = name; this.name = name;
this.description = description;
this.cron = cron; this.cron = cron;
this.ircMessage = ircMessage; this.ircMessage = ircMessage;
this.twitterMessage = twitterMessage; this.twitterMessage = twitterMessage;
@ -59,6 +62,11 @@ public class CronValue
return this.cron; return this.cron;
} }
public String getDescription()
{
return this.description;
}
public File getImageFile() public File getImageFile()
{ {
return this.imageFile; return this.imageFile;
@ -84,6 +92,11 @@ public class CronValue
this.cron = value; this.cron = value;
} }
public void setDescription(final String description)
{
this.description = description;
}
public void setImageFile(final File imageFile) public void setImageFile(final File imageFile)
{ {
this.imageFile = imageFile; this.imageFile = imageFile;

View File

@ -19,18 +19,21 @@
*/ */
package org.april.hebdobot.cron; package org.april.hebdobot.cron;
import org.apache.commons.lang3.StringUtils;
import org.april.hebdobot.bot.Hebdobot;
import org.quartz.Job; import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; import org.quartz.JobExecutionException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
* The Class Job. * The Class NotifyCronJob.
*/ */
public class CronFooJob implements Job public class NotifyJob implements Job
{ {
private static final Logger logger = LoggerFactory.getLogger(CronFooJob.class); private static final Logger logger = LoggerFactory.getLogger(NotifyJob.class);
/* (non-Javadoc) /* (non-Javadoc)
* @see org.quartz.Job#execute(org.quartz.JobExecutionContext) * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
@ -38,6 +41,28 @@ public class CronFooJob implements Job
@Override @Override
public void execute(final JobExecutionContext context) throws JobExecutionException public void execute(final JobExecutionContext context) throws JobExecutionException
{ {
logger.debug("CRON JOB"); logger.info("CRON FIRE " + context.getTrigger().getDescription());
JobDataMap map = context.getJobDetail().getJobDataMap();
Hebdobot bot = (Hebdobot) map.get("bot");
CronValue cron = (CronValue) map.get("cron");
if (StringUtils.isBlank(cron.getIrcMessage()))
{
logger.info("No IRC message so no notify.");
}
else
{
bot.notifyIrc(cron.getIrcMessage());
}
if (StringUtils.isBlank(cron.getTwitterMessage()))
{
logger.info("No Twitter message so no notify.");
}
else
{
bot.notifyTwitter(cron.getTwitterMessage(), cron.getImageFile());
}
} }
} }