All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jbpm.job.executor.LockMonitorThread Maven / Gradle / Ivy

The newest version!
package org.jbpm.job.executor;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.job.Job;
import org.jbpm.persistence.db.DbPersistenceService;
import org.jbpm.persistence.db.StaleObjectLogConfigurer;

public class LockMonitorThread extends Thread implements Deactivable {

  public static final String DEFAULT_NAME = "Monitor";

  private final JobExecutor jobExecutor;
  private volatile boolean active = true;

  public LockMonitorThread(JobExecutor jobExecutor) {
    this(DEFAULT_NAME, jobExecutor);
  }

  public LockMonitorThread(String name, JobExecutor jobExecutor) {
    super(jobExecutor.getThreadGroup(), name);
    this.jobExecutor = jobExecutor;
  }

  /**
   * @deprecated As of jBPM 3.2.6, replaced by {@link #LockMonitorThread(JobExecutor)}
   */
  public LockMonitorThread(JbpmConfiguration jbpmConfiguration, int lockMonitorInterval,
    int maxLockTime, int lockBufferTime) {
    jobExecutor = jbpmConfiguration.getJobExecutor();
  }

  public void run() {
    while (active) {
      try {
        unlockOverdueJobs();
      }
      catch (RuntimeException e) {
        log.error("exception in " + getName(), e);
      }
      if (active) {
        try {
          sleep(jobExecutor.getLockMonitorInterval());
        }
        catch (InterruptedException e) {
          if (log.isDebugEnabled()) log.debug(getName() + " got interrupted");
        }
      }
    }
    log.info(getName() + " leaves cyberspace");
  }

  protected void unlockOverdueJobs() {
    JbpmContext jbpmContext = jobExecutor.getJbpmConfiguration().createJbpmContext();
    try {
      Date threshold = new Date(System.currentTimeMillis() - jobExecutor.getMaxLockTime());
      List overdueJobs = jbpmContext.getJobSession().findJobsWithOverdueLockTime(threshold);
      for (Iterator i = overdueJobs.iterator(); i.hasNext();) {
        Job job = (Job) i.next();
        if (log.isDebugEnabled()) log.debug("unlocking " + job);
        job.setLockOwner(null);
        job.setLockTime(null);
      }
    }
    catch (RuntimeException e) {
      jbpmContext.setRollbackOnly();
      if (!DbPersistenceService.isLockingException(e)) throw e;
      // keep locking exception quiet
      StaleObjectLogConfigurer.getStaleObjectExceptionsLog()
        .error("could not unlock overdue jobs", e);
    }
    catch (Error e) {
      jbpmContext.setRollbackOnly();
      throw e;
    }
    finally {
      try {
        jbpmContext.close();
      }
      catch (RuntimeException e) {
        if (!DbPersistenceService.isLockingException(e)) throw e;
        // keep locking exception quiet
        StaleObjectLogConfigurer.getStaleObjectExceptionsLog()
          .error("could not unlock overdue jobs", e);
      }
    }
  }

  /**
   * @deprecated As of jBPM 3.2.3, replaced by {@link #deactivate()}
   */
  public void setActive(boolean isActive) {
    if (isActive == false) deactivate();
  }

  public void deactivate() {
    if (active) {
      active = false;
      interrupt();
    }
  }

  private static Log log = LogFactory.getLog(LockMonitorThread.class);
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy