use of nl.nn.adapterframework.scheduler.SchedulerHelper in project iaf by ibissource.
the class LoadDatabaseSchedulesJob method execute.
@Override
public void execute(IbisManager ibisManager) {
Map<JobKey, IbisJobDetail> databaseJobDetails = new HashMap<JobKey, IbisJobDetail>();
Scheduler scheduler = null;
SchedulerHelper sh = getApplicationContext().getBean(SchedulerHelper.class);
try {
scheduler = sh.getScheduler();
// Fill the databaseJobDetails Map with all IbisJobDetails that have been stored in the database
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.anyJobGroup());
for (JobKey jobKey : jobKeys) {
IbisJobDetail detail = (IbisJobDetail) scheduler.getJobDetail(jobKey);
if (detail.getJobType() == JobType.DATABASE) {
databaseJobDetails.put(detail.getKey(), detail);
}
}
} catch (SchedulerException e) {
getMessageKeeper().add("unable to retrieve jobkeys from scheduler", e);
}
// Get all IbisSchedules that have been stored in the database
FixedQuerySender qs = SpringUtils.createBean(getApplicationContext(), FixedQuerySender.class);
qs.setDatasourceName(JndiDataSourceFactory.GLOBAL_DEFAULT_DATASOURCE_NAME);
qs.setQuery("SELECT COUNT(*) FROM IBISSCHEDULES");
try {
qs.configure();
qs.open();
try (Connection conn = qs.getConnection()) {
try (PreparedStatement stmt = conn.prepareStatement("SELECT JOBNAME,JOBGROUP,ADAPTER,RECEIVER,CRON,EXECUTIONINTERVAL,MESSAGE,LOCKER,LOCK_KEY FROM IBISSCHEDULES")) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String jobName = rs.getString("JOBNAME");
String jobGroup = rs.getString("JOBGROUP");
String adapterName = rs.getString("ADAPTER");
String javaListener = rs.getString("RECEIVER");
String cronExpression = rs.getString("CRON");
int interval = rs.getInt("EXECUTIONINTERVAL");
String message = rs.getString("MESSAGE");
boolean hasLocker = rs.getBoolean("LOCKER");
String lockKey = rs.getString("LOCK_KEY");
JobKey key = JobKey.jobKey(jobName, jobGroup);
Adapter adapter = ibisManager.getRegisteredAdapter(adapterName);
if (adapter == null) {
getMessageKeeper().add("unable to add schedule [" + key + "], adapter [" + adapterName + "] not found");
continue;
}
// Create a new JobDefinition so we can compare it with existing jobs
DatabaseJob jobdef = SpringUtils.createBean(adapter.getApplicationContext(), DatabaseJob.class);
jobdef.setCronExpression(cronExpression);
jobdef.setName(jobName);
jobdef.setInterval(interval);
jobdef.setJobGroup(jobGroup);
jobdef.setAdapterName(adapterName);
jobdef.setJavaListener(javaListener);
jobdef.setMessage(message);
if (hasLocker) {
Locker locker = SpringUtils.createBean(getApplicationContext(), Locker.class);
locker.setName(lockKey);
locker.setObjectId(lockKey);
locker.setDatasourceName(JndiDataSourceFactory.GLOBAL_DEFAULT_DATASOURCE_NAME);
jobdef.setLocker(locker);
}
try {
jobdef.configure();
} catch (ConfigurationException e) {
getMessageKeeper().add("unable to configure DatabaseJobDef [" + jobdef + "] with key [" + key + "]", e);
}
// If the job is found, find out if it is different from the existing one and update if necessarily
if (databaseJobDetails.containsKey(key)) {
IbisJobDetail oldJobDetails = databaseJobDetails.get(key);
if (!oldJobDetails.compareWith(jobdef)) {
log.debug("updating DatabaseSchedule [" + key + "]");
try {
sh.scheduleJob(jobdef);
} catch (SchedulerException e) {
getMessageKeeper().add("unable to update schedule [" + key + "]", e);
}
}
// Remove the key that has been found from the databaseJobDetails Map
databaseJobDetails.remove(key);
} else {
// The job was not found in the databaseJobDetails Map, which indicates it's new and has to be added
log.debug("add DatabaseSchedule [" + key + "]");
try {
sh.scheduleJob(jobdef);
} catch (SchedulerException e) {
getMessageKeeper().add("unable to add schedule [" + key + "]", e);
}
}
}
}
}
}
} catch (Exception e) {
// Only catch database related exceptions!
getMessageKeeper().add("unable to retrieve schedules from database", e);
} finally {
qs.close();
}
// Loop through all remaining databaseJobDetails, which were not present in the database. Since they have been removed, unschedule them!
for (JobKey key : databaseJobDetails.keySet()) {
log.debug("delete DatabaseSchedule [" + key + "]");
try {
scheduler.deleteJob(key);
} catch (SchedulerException e) {
getMessageKeeper().add("unable to remove schedule [" + key + "]", e);
}
}
}
use of nl.nn.adapterframework.scheduler.SchedulerHelper in project iaf by ibissource.
the class ShowScheduler method createSchedule.
private Response createSchedule(String groupName, String jobName, MultipartBody inputDataMap, boolean overwrite) {
if (inputDataMap == null) {
throw new ApiException("Missing post parameters");
}
String name = jobName;
if (// If name is not explicitly set, try to deduct it from inputmap
name == null)
name = resolveStringFromMap(inputDataMap, "name");
String cronExpression = resolveTypeFromMap(inputDataMap, "cron", String.class, "");
int interval = resolveTypeFromMap(inputDataMap, "interval", Integer.class, -1);
// Either one of the two has to be set
if (interval == -1 && StringUtils.isEmpty(cronExpression)) {
throw new ApiException("Either 'cron' or 'interval' has to be set");
}
String adapterName = resolveStringFromMap(inputDataMap, "adapter");
// Make sure the adapter exists!
DefaultIbisManager manager = (DefaultIbisManager) getIbisManager();
IAdapter adapter = manager.getRegisteredAdapter(adapterName);
if (adapter == null) {
throw new ApiException("Adapter [" + adapterName + "] not found");
}
// Make sure the receiver exists!
String receiverName = resolveStringFromMap(inputDataMap, "receiver");
Receiver<?> receiver = adapter.getReceiverByName(receiverName);
if (receiver == null) {
throw new ApiException("Receiver [" + receiverName + "] not found");
}
String listenerName = null;
IListener<?> listener = receiver.getListener();
if (listener != null) {
listenerName = listener.getName();
}
if (StringUtils.isEmpty(listenerName)) {
throw new ApiException("unable to determine listener for receiver [" + receiverName + "]");
}
Configuration applicationContext = adapter.getConfiguration();
String jobGroup = groupName;
if (StringUtils.isEmpty(jobGroup)) {
jobGroup = adapter.getConfiguration().getName();
}
boolean persistent = resolveTypeFromMap(inputDataMap, "persistent", boolean.class, false);
boolean hasLocker = resolveTypeFromMap(inputDataMap, "locker", boolean.class, false);
String lockKey = resolveTypeFromMap(inputDataMap, "lockkey", String.class, "lock4[" + name + "]");
String message = resolveStringFromMap(inputDataMap, "message");
String description = resolveStringFromMap(inputDataMap, "description");
SchedulerHelper sh = getSchedulerHelper();
// First try to create the schedule and run it on the local ibis before storing it in the database
DatabaseJob jobdef = SpringUtils.createBean(applicationContext, DatabaseJob.class);
jobdef.setCronExpression(cronExpression);
jobdef.setName(name);
jobdef.setAdapterName(adapterName);
jobdef.setJavaListener(listenerName);
jobdef.setJobGroup(jobGroup);
jobdef.setMessage(message);
jobdef.setDescription(description);
jobdef.setInterval(interval);
if (hasLocker) {
Locker locker = SpringUtils.createBean(applicationContext, Locker.class);
locker.setName(lockKey);
locker.setObjectId(lockKey);
locker.setDatasourceName(JndiDataSourceFactory.GLOBAL_DEFAULT_DATASOURCE_NAME);
jobdef.setLocker(locker);
}
try {
jobdef.configure();
sh.scheduleJob(jobdef);
} catch (Exception e) {
throw new ApiException("Failed to add schedule", e);
}
// Save the job in the database
if (persistent && AppConstants.getInstance().getBoolean("loadDatabaseSchedules.active", false)) {
boolean success = false;
FixedQuerySender qs = SpringUtils.createBean(applicationContext, FixedQuerySender.class);
qs.setDatasourceName(JndiDataSourceFactory.GLOBAL_DEFAULT_DATASOURCE_NAME);
qs.setQuery("SELECT COUNT(*) FROM IBISSCHEDULES");
try {
qs.configure();
} catch (ConfigurationException e) {
throw new ApiException("Error creating FixedQuerySender bean to store job in database", e);
}
try {
qs.open();
try (Connection conn = qs.getConnection()) {
if (overwrite) {
String deleteQuery = "DELETE FROM IBISSCHEDULES WHERE JOBNAME=? AND JOBGROUP=?";
try (PreparedStatement deleteStatement = conn.prepareStatement(deleteQuery)) {
deleteStatement.setString(1, name);
deleteStatement.setString(2, jobGroup);
deleteStatement.executeUpdate();
}
}
String insertQuery = "INSERT INTO IBISSCHEDULES (JOBNAME, JOBGROUP, ADAPTER, RECEIVER, CRON, EXECUTIONINTERVAL, MESSAGE, DESCRIPTION, LOCKER, LOCK_KEY, CREATED_ON, BY_USER) " + "VALUES (?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP,?)";
try (PreparedStatement stmt = conn.prepareStatement(insertQuery)) {
stmt.setString(1, name);
stmt.setString(2, jobGroup);
stmt.setString(3, adapterName);
stmt.setString(4, listenerName);
stmt.setString(5, cronExpression);
stmt.setInt(6, interval);
stmt.setClob(7, new StringReader(message));
stmt.setString(8, description);
stmt.setBoolean(9, hasLocker);
stmt.setString(10, lockKey);
stmt.setString(11, getUserPrincipalName());
success = stmt.executeUpdate() > 0;
}
}
} catch (SenderException | SQLException | JdbcException e) {
throw new ApiException("error saving job in database", e);
} finally {
qs.close();
}
if (!success)
throw new ApiException("An error occurred while storing the job in the database");
}
return Response.status(Response.Status.CREATED).build();
}
use of nl.nn.adapterframework.scheduler.SchedulerHelper in project iaf by ibissource.
the class ShowScheduler method trigger.
@PUT
@RolesAllowed({ "IbisDataAdmin", "IbisAdmin", "IbisTester" })
@Path("/schedules/{groupName}/job/{jobName}")
@Relation("schedules")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response trigger(@PathParam("jobName") String jobName, @PathParam("groupName") String groupName, LinkedHashMap<String, Object> json) throws ApiException {
Scheduler scheduler = getScheduler();
if (log.isInfoEnabled()) {
String commandIssuedBy = request.getRemoteHost();
commandIssuedBy += "-" + request.getRemoteAddr();
commandIssuedBy += "-" + request.getRemoteUser();
log.info("trigger job jobName [" + jobName + "] groupName [" + groupName + "] " + commandIssuedBy);
}
JobKey jobKey = JobKey.jobKey(jobName, groupName);
// PAUSE,RESUME,TRIGGER
String action = "";
for (Entry<String, Object> entry : json.entrySet()) {
String key = entry.getKey();
if (key.equalsIgnoreCase("action")) {
// Start or stop an adapter!
action = (String) entry.getValue();
}
}
try {
if ("pause".equals(action)) {
scheduler.pauseJob(jobKey);
} else if ("resume".equals(action)) {
SchedulerHelper sh = getSchedulerHelper();
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
// TODO this part can be more generic in case multiple triggers
// can be configurable
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
if (triggers != null) {
for (Trigger trigger : triggers) {
if (trigger instanceof CronTrigger) {
sh.scheduleJob(jobDetail, ((CronTrigger) trigger).getCronExpression(), -1, true);
} else if (trigger instanceof SimpleTrigger) {
sh.scheduleJob(jobDetail, null, ((SimpleTrigger) trigger).getRepeatInterval(), true);
}
}
}
scheduler.resumeJob(jobKey);
} else if ("trigger".equals(action)) {
scheduler.triggerJob(jobKey);
} else {
throw new ApiException("no (valid) action provided! Expected one of PAUSE,RESUME,TRIGGER");
}
} catch (SchedulerException e) {
throw new ApiException("Failed to " + action + " job", e);
}
return Response.status(Response.Status.OK).build();
}
Aggregations