Search in sources :

Example 1 with DatabaseJob

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;
}
Also used : TriggerState(org.quartz.Trigger.TriggerState) JobDetail(org.quartz.JobDetail) IbisJobDetail(nl.nn.adapterframework.scheduler.IbisJobDetail) JobDataMap(org.quartz.JobDataMap) Locker(nl.nn.adapterframework.util.Locker) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Scheduler(org.quartz.Scheduler) IJob(nl.nn.adapterframework.scheduler.job.IJob) DatabaseJob(nl.nn.adapterframework.scheduler.job.DatabaseJob) IbisJobDetail(nl.nn.adapterframework.scheduler.IbisJobDetail)

Example 2 with DatabaseJob

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();
}
Also used : Locker(nl.nn.adapterframework.util.Locker) Configuration(nl.nn.adapterframework.configuration.Configuration) SQLException(java.sql.SQLException) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) JdbcException(nl.nn.adapterframework.jdbc.JdbcException) SenderException(nl.nn.adapterframework.core.SenderException) JdbcException(nl.nn.adapterframework.jdbc.JdbcException) SQLException(java.sql.SQLException) SchedulerException(org.quartz.SchedulerException) ConfigurationException(nl.nn.adapterframework.configuration.ConfigurationException) SchedulerHelper(nl.nn.adapterframework.scheduler.SchedulerHelper) ConfigurationException(nl.nn.adapterframework.configuration.ConfigurationException) DatabaseJob(nl.nn.adapterframework.scheduler.job.DatabaseJob) StringReader(java.io.StringReader) SenderException(nl.nn.adapterframework.core.SenderException) IAdapter(nl.nn.adapterframework.core.IAdapter) DefaultIbisManager(nl.nn.adapterframework.unmanaged.DefaultIbisManager) FixedQuerySender(nl.nn.adapterframework.jdbc.FixedQuerySender)

Aggregations

DatabaseJob (nl.nn.adapterframework.scheduler.job.DatabaseJob)2 Locker (nl.nn.adapterframework.util.Locker)2 StringReader (java.io.StringReader)1 Connection (java.sql.Connection)1 PreparedStatement (java.sql.PreparedStatement)1 SQLException (java.sql.SQLException)1 HashMap (java.util.HashMap)1 LinkedHashMap (java.util.LinkedHashMap)1 Configuration (nl.nn.adapterframework.configuration.Configuration)1 ConfigurationException (nl.nn.adapterframework.configuration.ConfigurationException)1 IAdapter (nl.nn.adapterframework.core.IAdapter)1 SenderException (nl.nn.adapterframework.core.SenderException)1 FixedQuerySender (nl.nn.adapterframework.jdbc.FixedQuerySender)1 JdbcException (nl.nn.adapterframework.jdbc.JdbcException)1 IbisJobDetail (nl.nn.adapterframework.scheduler.IbisJobDetail)1 SchedulerHelper (nl.nn.adapterframework.scheduler.SchedulerHelper)1 IJob (nl.nn.adapterframework.scheduler.job.IJob)1 DefaultIbisManager (nl.nn.adapterframework.unmanaged.DefaultIbisManager)1 JobDataMap (org.quartz.JobDataMap)1 JobDetail (org.quartz.JobDetail)1