use of nl.nn.adapterframework.scheduler.job.DatabaseJob in project iaf by ibissource.
the class ShowScheduler method getJobData.
private Map<String, Object> getJobData(JobKey jobKey, boolean expanded) throws SchedulerException {
Map<String, Object> jobData = new HashMap<String, Object>();
Scheduler scheduler = getScheduler();
String jobName = jobKey.getName();
JobDetail job = scheduler.getJobDetail(jobKey);
jobData.put("fullName", job.getKey().getGroup() + "." + job.getKey().getName());
jobData.put("name", job.getKey().getName());
jobData.put("group", job.getKey().getGroup());
String description = "-";
if (StringUtils.isNotEmpty(job.getDescription()))
description = job.getDescription();
jobData.put("description", description);
jobData.put("stateful", job.isPersistJobDataAfterExecution() && job.isConcurrentExectionDisallowed());
jobData.put("durable", job.isDurable());
jobData.put("jobClass", job.getJobClass().getSimpleName());
if (job instanceof IbisJobDetail) {
jobData.put("type", ((IbisJobDetail) job).getJobType());
}
TriggerState state = scheduler.getTriggerState(TriggerKey.triggerKey(jobName, jobKey.getGroup()));
jobData.put("state", state.name());
jobData.put("triggers", getJobTriggers(scheduler.getTriggersOfJob(jobKey)));
jobData.put("messages", getJobMessages(job));
JobDataMap jobMap = job.getJobDataMap();
jobData.put("properties", getJobData(jobMap));
if (expanded) {
IJob jobDef = (IJob) jobMap.get(ConfiguredJob.JOBDEF_KEY);
if (jobDef instanceof DatabaseJob) {
DatabaseJob dbJob = (DatabaseJob) jobDef;
jobData.put("adapter", dbJob.getAdapterName());
jobData.put("listener", dbJob.getJavaListener());
jobData.put("message", dbJob.getMessage());
}
Locker locker = jobDef.getLocker();
if (locker != null) {
jobData.put("locker", true);
jobData.put("lockkey", locker.getObjectId());
} else {
jobData.put("locker", false);
}
}
return jobData;
}
use of nl.nn.adapterframework.scheduler.job.DatabaseJob 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();
}
Aggregations