Search in sources :

Example 6 with Locker

use of nl.nn.adapterframework.util.Locker in project iaf by ibissource.

the class StreamingPipeTest method testCanProvideOutputStreamWithLocker.

@Test
public void testCanProvideOutputStreamWithLocker() throws ConfigurationException, PipeStartException {
    Locker locker = new Locker() {

        @Override
        public void configure() throws ConfigurationException {
        // skip configure, only need locker object to be present
        }
    };
    pipe.setLocker(locker);
    configureAndStartPipe();
    assertFalse(pipe.canProvideOutputStream());
}
Also used : Locker(nl.nn.adapterframework.util.Locker) Test(org.junit.Test)

Example 7 with Locker

use of nl.nn.adapterframework.util.Locker in project iaf by ibissource.

the class LockerPipeProcessor method processPipe.

public PipeRunResult processPipe(PipeLine pipeLine, IPipe pipe, String messageId, Object message, IPipeLineSession pipeLineSession) throws PipeRunException {
    PipeRunResult pipeRunResult;
    IExtendedPipe extendedPipe = null;
    Locker locker = null;
    String objectId = null;
    if (pipe instanceof IExtendedPipe) {
        extendedPipe = (IExtendedPipe) pipe;
        locker = extendedPipe.getLocker();
    }
    if (locker != null) {
        try {
            objectId = locker.lock();
        } catch (Exception e) {
            throw new PipeRunException(pipe, "error while setting lock", e);
        }
    }
    if (objectId != null) {
        try {
            pipeRunResult = pipeProcessor.processPipe(pipeLine, pipe, messageId, message, pipeLineSession);
        } finally {
            try {
                locker.unlock(objectId);
            } catch (Exception e) {
                throw new PipeRunException(pipe, "error while removing lock", e);
            }
        }
    } else {
        pipeRunResult = pipeProcessor.processPipe(pipeLine, pipe, messageId, message, pipeLineSession);
    }
    return pipeRunResult;
}
Also used : PipeRunResult(nl.nn.adapterframework.core.PipeRunResult) Locker(nl.nn.adapterframework.util.Locker) PipeRunException(nl.nn.adapterframework.core.PipeRunException) IExtendedPipe(nl.nn.adapterframework.core.IExtendedPipe) PipeRunException(nl.nn.adapterframework.core.PipeRunException)

Example 8 with Locker

use of nl.nn.adapterframework.util.Locker in project iaf by ibissource.

the class LockerPipeProcessor method processPipe.

@Override
protected PipeRunResult processPipe(PipeLine pipeLine, IPipe pipe, Message message, PipeLineSession pipeLineSession, ThrowingFunction<Message, PipeRunResult, PipeRunException> chain) throws PipeRunException {
    PipeRunResult pipeRunResult;
    IExtendedPipe extendedPipe = null;
    Locker locker = null;
    String objectId = null;
    if (pipe instanceof IExtendedPipe) {
        extendedPipe = (IExtendedPipe) pipe;
        locker = extendedPipe.getLocker();
    }
    if (locker != null) {
        try {
            objectId = locker.acquire();
        } catch (Exception e) {
            throw new PipeRunException(pipe, "error while trying to obtain lock [" + locker + "]", e);
        }
        if (objectId == null) {
            throw new PipeRunException(pipe, "could not obtain lock [" + locker + "]");
        }
        try {
            pipeRunResult = chain.apply(message);
        } finally {
            try {
                locker.release(objectId);
            } catch (Exception e) {
                throw new PipeRunException(pipe, "error while removing lock", e);
            }
        }
    } else {
        pipeRunResult = chain.apply(message);
    }
    return pipeRunResult;
}
Also used : PipeRunResult(nl.nn.adapterframework.core.PipeRunResult) Locker(nl.nn.adapterframework.util.Locker) PipeRunException(nl.nn.adapterframework.core.PipeRunException) IExtendedPipe(nl.nn.adapterframework.core.IExtendedPipe) PipeRunException(nl.nn.adapterframework.core.PipeRunException)

Example 9 with Locker

use of nl.nn.adapterframework.util.Locker 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);
        }
    }
}
Also used : SchedulerException(org.quartz.SchedulerException) Locker(nl.nn.adapterframework.util.Locker) HashMap(java.util.HashMap) Scheduler(org.quartz.Scheduler) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) Adapter(nl.nn.adapterframework.core.Adapter) IbisJobDetail(nl.nn.adapterframework.scheduler.IbisJobDetail) ConfigurationException(nl.nn.adapterframework.configuration.ConfigurationException) SchedulerException(org.quartz.SchedulerException) JobKey(org.quartz.JobKey) SchedulerHelper(nl.nn.adapterframework.scheduler.SchedulerHelper) ConfigurationException(nl.nn.adapterframework.configuration.ConfigurationException) ResultSet(java.sql.ResultSet) FixedQuerySender(nl.nn.adapterframework.jdbc.FixedQuerySender)

Example 10 with Locker

use of nl.nn.adapterframework.util.Locker 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

Locker (nl.nn.adapterframework.util.Locker)13 Test (org.junit.Test)5 PipeRunException (nl.nn.adapterframework.core.PipeRunException)4 Connection (java.sql.Connection)2 PreparedStatement (java.sql.PreparedStatement)2 SQLException (java.sql.SQLException)2 HashMap (java.util.HashMap)2 ConfigurationException (nl.nn.adapterframework.configuration.ConfigurationException)2 IExtendedPipe (nl.nn.adapterframework.core.IExtendedPipe)2 PipeLineResult (nl.nn.adapterframework.core.PipeLineResult)2 PipeRunResult (nl.nn.adapterframework.core.PipeRunResult)2 FixedQuerySender (nl.nn.adapterframework.jdbc.FixedQuerySender)2 IbisJobDetail (nl.nn.adapterframework.scheduler.IbisJobDetail)2 SchedulerHelper (nl.nn.adapterframework.scheduler.SchedulerHelper)2 DatabaseJob (nl.nn.adapterframework.scheduler.job.DatabaseJob)2 IJob (nl.nn.adapterframework.scheduler.job.IJob)2 Scheduler (org.quartz.Scheduler)2 SchedulerException (org.quartz.SchedulerException)2 StringReader (java.io.StringReader)1 ResultSet (java.sql.ResultSet)1