Example usage for com.liferay.portal.kernel.scheduler SchedulerEngineHelperUtil getJobState

List of usage examples for com.liferay.portal.kernel.scheduler SchedulerEngineHelperUtil getJobState

Introduction

In this page you can find the example usage for com.liferay.portal.kernel.scheduler SchedulerEngineHelperUtil getJobState.

Prototype

public static TriggerState getJobState(String jobName, String groupName, StorageType storageType)
            throws SchedulerException 

Source Link

Usage

From source file:de.uhh.l2g.plugins.util.PortletScheduler.java

License:Open Source License

/**
 * Reads Scheduler entries from Portlet Preferences
 * /*from   w  w  w.j  ava  2 s  . c om*/
 * WARN: This will disable Multiple Quartz Jobs (Triggers) per Listener Feature
 * 
 * @param schedulerClassName
 * @param portletId
 */
public void initScheduler(String schedulerClassName, ServiceContext serviceContext) {
    Portlet portlet = PortletLocalServiceUtil.getPortletById(serviceContext.getPortletId());
    List<SchedulerEntry> jobs = new LinkedList<SchedulerEntry>();
    List<SchedulerEntry> duplicates = new LinkedList<SchedulerEntry>();

    LOG.info("Initializing schedulers for " + schedulerClassName + " " + portletId);

    this.schedulerClassName = schedulerClassName;
    this.portletId = serviceContext.getPortletId();

    // Load Quartz Job (Unique for ClassName!)
    assembleMessageFromResponses();

    // Fetch List of Schedulers started on portlet initialization (maybe we
    // do have a Trigger,...)
    jobs = portlet.getSchedulerEntries();
    for (SchedulerEntry job : jobs) {
        // Grab first scheduler associated with given Class
        if (job.getEventListenerClass().equalsIgnoreCase(this.schedulerClassName)) {
            if (this.schedulerEntry == null) {
                LOG.info(job.toString());
                this.schedulerEntry = job;
                // Get Trigger
                try {
                    this.generalTrigger = job.getTrigger();
                    if (this.generalTrigger != null) {
                        // Try persisting our Trigger in DB
                        String currentCron = GetterUtil
                                .getString(this.generalTrigger.getTriggerContent().toString());
                        this.triggerState = SchedulerEngineHelperUtil.getJobState(job.getEventListenerClass(),
                                job.getEventListenerClass(), this.getStorageType());
                        String persistCron = ScheduledThreadLocalServiceUtil
                                .getCronBySchedulerName(job.getEventListenerClass());
                        if (persistCron == null || persistCron.isEmpty())
                            ScheduledThreadLocalServiceUtil.addScheduledThread(schedulerClassName, currentCron,
                                    serviceContext);
                        // Overwrite if we encounter new value (assume
                        // PortletScheduler Names are unique)
                        if (!persistCron.equals(currentCron) && !currentCron.isEmpty())
                            ScheduledThreadLocalServiceUtil.updateScheduledThread(schedulerClassName,
                                    currentCron, serviceContext);
                    }
                } catch (SchedulerException t) {
                    LOG.warn(t);
                } catch (SystemException e) {
                    LOG.warn("Failed Loading Persitence - Recovery of Triggers will fail", e);
                } catch (PortalException e) {
                    LOG.warn("", e);
                }
            } else { // Collect duplicate SchedulerEntries
                LOG.warn("Multiple runnging Jobs found for same Scheduled Task! Removing ... " + job);
                duplicates.add(job);
            }
        }
    }
    // remove duplicates
    jobs.removeAll(duplicates);

    // Check if we got what we've been looking for
    if (schedulerEntry == null) {
        LOG.warn("No SchedulerEntry found for this Job. Generating new Entry...");
        assembleEntryFromSettings(portletId, this.triggerState);
    }

}

From source file:de.uhh.l2g.plugins.util.PortletScheduler.java

License:Open Source License

/**
 * Crowds this Scheduler with ResponseMessage Data Unique iff (jobName ==
 * schedulerClassName == groupName && storageType == STOR)
 * //from  w  ww.  j a  va2s  .c  om
 * @return PortletScheduler
 */
public PortletScheduler assembleMessageFromResponses() {

    // These should be unique if everything is configured by liferay default
    try {
        List<SchedulerResponse> scheduledJobs = SchedulerEngineHelperUtil.getScheduledJobs();
        for (SchedulerResponse resp : scheduledJobs) {
            if (resp.getJobName().equalsIgnoreCase(this.schedulerClassName)) {
                this.setJobName(resp.getJobName());
                this.setGroupName(resp.getGroupName());
                this.setStorageType(resp.getStorageType());
                this.setDescription(resp.getDescription());
                this.setMessage(resp.getMessage());
                this.setTrigger(resp.getTrigger());

                if (this.getMessage() == null)
                    this.setMessage(new Message());
                LOG.debug("Job found. Copy Portlet Information: " + this.getMessage().toString());
                Map<String, Object> map = this.getMessage().getValues();

                // Fill this message with portlet specific data
                if (map.containsKey(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME))
                    this.getMessage().put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME,
                            map.get(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME).toString());
                if (map.containsKey(SchedulerEngine.PORTLET_ID))
                    this.getMessage().put(SchedulerEngine.PORTLET_ID,
                            map.get(SchedulerEngine.PORTLET_ID).toString());
                if (map.containsKey(SchedulerEngine.MESSAGE_LISTENER_UUID))
                    this.getMessage().put(SchedulerEngine.MESSAGE_LISTENER_UUID,
                            map.get(SchedulerEngine.MESSAGE_LISTENER_UUID).toString());

                LOG.debug(this.getMessage().get(SchedulerEngine.DESTINATION_NAME) + " "
                        + this.getMessage().getDestinationName() + " "
                        + this.getMessage().getValues().get(SchedulerEngine.DESTINATION_NAME) + " "
                        + this.getMessage().getDestinationName());

                if (map.containsKey("MESSAGE_LISTENER_CLASS_NAME") && map.get("DESTINATION_NAME") != null) {
                    this.destination = map.get("DESTINATION_NAME").toString();
                    // this.getMessage().put(SchedulerEngine.DESTINATION_NAME,
                    // map.get("DESTINATION_NAME").toString());
                    this.getMessage().getValues().put(SchedulerEngine.DESTINATION_NAME,
                            map.get("DESTINATION_NAME").toString());
                    this.getMessage().setDestinationName(
                            this.getMessage().getValues().get(SchedulerEngine.DESTINATION_NAME).toString());
                } else {
                    LOG.debug("Destination not available yet. Setting to " + DEST);
                    this.destination = DEST;
                    // this.getMessage().put(SchedulerEngine.DESTINATION_NAME,
                    // DEST);
                    this.getMessage().getValues().put(SchedulerEngine.DESTINATION_NAME, DEST);
                    this.getMessage().setDestinationName(
                            this.getMessage().getValues().get(SchedulerEngine.DESTINATION_NAME).toString());
                }
                // new ReceiverKey(this.getJobName(), this.getGroupName())
                this.getMessage().put(SchedulerEngine.RECEIVER_KEY,
                        GetterUtil.getString(new ReceiverKey(this.getJobName(), this.getGroupName())));
                LOG.debug("ReceiverKey: " + new ReceiverKey(this.getJobName(), this.getGroupName()));
                TriggerState state = SchedulerEngineHelperUtil.getJobState(this.getJobName(),
                        this.getGroupName(), this.getStorageType());
                LOG.debug(state);
            }
        }
    } catch (SchedulerException e) {
        LOG.warn(e);
    }
    return this;
}

From source file:de.uhh.l2g.plugins.util.PortletScheduler.java

License:Open Source License

/**
 * Schedule unscheduled Scheduler (requires valid SchedulerEntry Data &&
 * Message Date)// w  w  w. j a  v  a  2s.com
 * 
 * There is no Issue in Liferay Tracker about this: Manually assembling.
 * Message, Trigger and Job from previously "working" Job, in order to use
 * 
 * SchedulerEngineHelperUtil.schedule(Trigger, StorageType, Description,
 * Destination, Message, exceptionsMaxSize);
 * 
 * Currently (6.2 GA 4 - GA 6) also fails to register the MessageListener
 * correctly for a single consumer. This might be a configuration detail
 * issue, which is not documented in liferays SchedulerEngineHelperUtil, at
 * first sight source investigation does not reveal conclusive hints.
 * 
 * Though the more complicated issue is that Quartz does persist the Job on
 * UNSCHEDULE but not the Trigger.
 * 
 * Therefore a SchedulerEntry must be available in Memory, to schedule an
 * unscheduled Job Liferay SchedulerEntry however does persit the Trigger...
 * but does not check for duplicates on deploy.
 * 
 * If we keep the SchedulerEntry in the List we have the Trigger but
 * unregister fails and duplicates the Scheduler If we remove the
 * SchedulerEntry unregister works correctly but we lose the Trigger
 * 
 * @throws ClassNotFoundException
 * @throws IllegalAccessException
 * @throws SchedulerException
 * @throws Exception
 * @throws InstantiationException
 *             *
 */
public void schedule() {
    int exceptionsMaxSize = 0;
    try {
        String messageText = GetterUtil.getString((this.getMessage().toString()));
        LOG.info("Starting :" + messageText);

        Map<String, Object> map = this.getMessage().getValues();

        String portletId = "";
        String listenerName = "";

        if (map.containsKey(SchedulerEngine.PORTLET_ID))
            portletId = map.get(SchedulerEngine.PORTLET_ID).toString();
        if (map.containsKey(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME))
            listenerName = map.get(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME).toString();
        if (map.containsKey(SchedulerEngine.EXCEPTIONS_MAX_SIZE))
            exceptionsMaxSize = Integer.valueOf(map.get(SchedulerEngine.EXCEPTIONS_MAX_SIZE).toString());

        LOG.info("Message :" + portletId + " " + listenerName + " " + this.destination);

        if (this.getTrigger() == null)
            this.setTrigger(this.generalTrigger);
        TriggerState state = SchedulerEngineHelperUtil.getJobState(this.getJobName(), this.getGroupName(),
                this.getStorageType());
        LOG.info("Trigger :" + GetterUtil.getString(this.getTrigger().toString()) + state);
        if (state != null && state.equals(TriggerState.UNSCHEDULED)) {
            this.getMessage().put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, this.schedulerClassName);
            this.getMessage().setDestinationName(this.DEST);
            this.getMessage().put(SchedulerEngine.RECEIVER_KEY,
                    this.getMessage().getValues().get(SchedulerEngine.RECEIVER_KEY).toString());
            LOG.info("Scheduling :" + this.schedulerClassName + " ");
            LOG.info("New Message " + this.getMessage().toString());
            Thread thread = Thread.currentThread();
            LOG.info("Thread :" + thread.getContextClassLoader() + thread.toString());
            if (this.schedulerEntry != null && this.getTrigger() != null)
                SchedulerEngineHelperUtil.schedule(schedulerEntry, this.getStorageType(), portletId,
                        exceptionsMaxSize);
            else
                assembleEntryFromSettings(this.schedulerClassName, TriggerState.NORMAL);
        } else {
            if (state == null)
                LOG.error("Could not find Job with Name: " + this.schedulerClassName);
            else
                LOG.info("Could not schedule Job with State: " + state);
        }

    } catch (SchedulerException e) {
        LOG.warn("", e);
    } catch (IllegalArgumentException e) {
        LOG.warn(e);
    }
}

From source file:de.uhh.l2g.plugins.util.PortletScheduler.java

License:Open Source License

/**
 * Unschedules Quartz Job but keeps SchedulerEntry in Memory (Scheduler will
 * be not correctly (re)deployed if in state UNSCHEDULED
 * /*  www.  j a va  2 s .com*/
 */
public void unschedule() {
    try {
        List<SchedulerResponse> scheduledJobs = SchedulerEngineHelperUtil.getScheduledJobs();
        for (SchedulerResponse resp : scheduledJobs) {
            if (resp.getJobName().equalsIgnoreCase(this.schedulerClassName)) {

                LOG.info("Stopping :" + resp.toString());
                Map<String, Object> map = resp.getMessage().getValues();

                String portletId = "";
                String listenerName = "";

                if (map.containsKey(SchedulerEngine.PORTLET_ID))
                    portletId = map.get(SchedulerEngine.PORTLET_ID).toString();
                if (map.containsKey(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME))
                    listenerName = map.get(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME).toString();

                LOG.info("Associated to :" + portletId + " " + listenerName + " " + this.destination);

                TriggerState state = SchedulerEngineHelperUtil.getJobState(resp.getJobName(),
                        resp.getGroupName(), resp.getStorageType());

                if (state != (TriggerState.UNSCHEDULED)) {

                    Thread thread = Thread.currentThread();
                    LOG.info("Thread :" + thread.getContextClassLoader() + thread.toString());

                    LOG.info("Unscheduling :" + this.schedulerClassName + " " + resp.getTrigger().toString());
                    SchedulerEngineHelperUtil.unschedule(schedulerEntry, resp.getStorageType());
                    // TODO: Check Workaround
                    // This removes the SchedulerEntry from Liferay's
                    // Scheduler List so it is not started aditionally on
                    // re-deploy
                    // BUT, removing this entry will also destroy our
                    // Trigger (as Quartz unschedule(), removes the Trigger
                    // from QuartzJob
                    this.removeFromEntries();
                } else {
                    LOG.warn("Scheduler could not be unscheduled beacuse it was in state " + state);
                }
            }
        }

    } catch (SchedulerException e) {
        LOG.warn("Failed to unschedule job" + this.schedulerClassName, e);
    }
}

From source file:de.uhh.l2g.plugins.util.PortletScheduler.java

License:Open Source License

/**
 * Deletes the Scheduler thoroughly until server restart!
 * /* ww w.j a  v a2  s. c  o m*/
 */
public void delete() {
    try {
        List<SchedulerResponse> scheduledJobs = SchedulerEngineHelperUtil.getScheduledJobs();
        for (SchedulerResponse resp : scheduledJobs) {
            if (resp.getJobName().equalsIgnoreCase(this.schedulerClassName)) {

                LOG.info("Stopping :" + resp.toString());
                Map<String, Object> map = resp.getMessage().getValues();

                String portletId = "";
                String listenerName = "";

                if (map.containsKey(SchedulerEngine.PORTLET_ID))
                    portletId = map.get(SchedulerEngine.PORTLET_ID).toString();
                if (map.containsKey(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME))
                    listenerName = map.get(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME).toString();

                LOG.info("Associated to :" + portletId + " " + listenerName + " " + this.destination);

                TriggerState state = SchedulerEngineHelperUtil.getJobState(resp.getJobName(),
                        resp.getGroupName(), resp.getStorageType());

                if (state.equals(TriggerState.NORMAL)) {

                    Thread thread = Thread.currentThread();
                    LOG.info("Thread :" + thread.getContextClassLoader() + thread.toString());

                    LOG.info("Unscheduling :" + this.schedulerClassName + " " + resp.getTrigger().toString());
                    SchedulerEngineHelperUtil.delete(schedulerEntry, resp.getStorageType());
                    // This removes the SchedulerEntry from Liferay's
                    // Scheduler List so it is not started aditionally on
                    // re-deploy
                    // Removing this entry will also destroy our Trigger (as
                    // Quartz unschedule(), removes the Trigger from
                    // QuartzJob
                    this.removeFromEntries();
                } else {
                    LOG.warn("Scheduler could not be unscheduled beacuse it was in state " + state);
                }
            }
        }

    } catch (SchedulerException e) {
        LOG.warn("Failed to unschedule job" + this.schedulerClassName, e);
    }
}

From source file:de.uhh.l2g.plugins.util.PortletScheduler.java

License:Open Source License

/**
 * Unschedules and removes all Jobs associated with this Listener Class'
 * /*from w ww . ja  v  a2s  .c o  m*/
 * Assumes Job and Group Name are equal
 */
public static void removeAllJobs(String portletId) {
    List<SchedulerResponse> scheduledJobs;
    List<SchedulerEntry> entries;
    Portlet portlet = PortletLocalServiceUtil.getPortletById(portletId);
    List<SchedulerEntry> toRemove = new LinkedList<SchedulerEntry>();
    TriggerState state;

    try {
        scheduledJobs = SchedulerEngineHelperUtil.getScheduledJobs();
        for (SchedulerResponse resp : scheduledJobs) {
            if (resp.getJobName().startsWith(PortletScheduler.class.getPackage().getName())) {
                state = SchedulerEngineHelperUtil.getJobState(resp.getJobName(), resp.getGroupName(),
                        resp.getStorageType());
                if (state != (TriggerState.UNSCHEDULED))
                    SchedulerEngineHelperUtil.unschedule(resp.getJobName(), resp.getGroupName(),
                            resp.getStorageType());
                entries = portlet.getSchedulerEntries();
                for (SchedulerEntry entry : entries) {
                    if (entry.getEventListenerClass().equalsIgnoreCase(resp.getJobName())) {
                        LOG.info("SchedulerEntry: " + entry.toString());
                        toRemove.add(entry);
                    }
                }
                entries.removeAll(toRemove);
            }
        }
        LOG.warn("Removed all Schedulers associated with " + PortletScheduler.class.getPackage().getName());
    } catch (SchedulerException e) {
        LOG.error("Could not retrieve ScheduledJobs");
    }
}

From source file:de.uhh.l2g.plugins.util.PortletScheduler.java

License:Open Source License

public static List<PortletScheduler> ListSchedulers() {
    List<PortletScheduler> schedulers = new LinkedList<PortletScheduler>();
    PortletScheduler psch = null;/* w  w w  .jav a2s  .c om*/

    try {
        List<SchedulerResponse> scheduledJobs = SchedulerEngineHelperUtil.getScheduledJobs();
        for (SchedulerResponse resp : scheduledJobs) {
            if (resp != null && resp.getJobName().contains(PortletScheduler.class.getPackage().getName())) {
                psch = new PortletScheduler();

                LOG.info(resp.toString());
                psch.setJobName(resp.getJobName());
                psch.setGroupName(resp.getGroupName());
                psch.setStorageType(resp.getStorageType());
                psch.setDescription(resp.getDescription());
                psch.setMessage(resp.getMessage());
                psch.setTrigger(resp.getTrigger());
                TriggerState state = SchedulerEngineHelperUtil.getJobState(resp.getJobName(),
                        resp.getGroupName(), resp.getStorageType());
                schedulers.add(psch);
                LOG.info("SchedulerResponse: " + psch.getJobName());
            }

        }

    } catch (SchedulerException e) {
        LOG.error("Could not retrieve ScheduledJobs");
    }
    return schedulers;
}