2.17.2: 2011-06-17

net.sf.basedb.core
Class InternalJobQueue

java.lang.Object
  extended by java.util.TimerTask
      extended by net.sf.basedb.core.InternalJobQueue
All Implemented Interfaces:
Runnable

public final class InternalJobQueue
extends TimerTask

A simple implementation of a job queue that executes jobs in order of priority and longest waiting time. To allow quick jobs like importing raw data or reporters to run it is possible to reserve slots per Job.ExecutionTime setting. The configuration is done in the base.config file with the following settings:

Setting Default/possible value(s) Description
jobqueue.internal.enabled true | false If the internal job queue is enabled or not. Do not disable the job queue if you don't have another external job queue manager. It is possible to use both an external and internal job queue.
jobqueue.internal.checkinterval 30 The interval, in seconds, that the job queue checks the database for new jobs.
jobqueue.internal.maxthreadpriority Thread.NORM_PRIORITY - 1 The maximum thread priority for the threads that execute jobs. See Thread.setPriority(int) for possible values.
jobqueue.internal.shortest.threads 1 Number of threads to reserve for jobs with an estimated execution time of less than one minute. Jobs with this setting may also use threads from the other "slower" slots.
jobqueue.internal.shortest.threadpriority Thread.NORM_PRIORITY - 1 The thread priority to use when executing jobs in this slot. See Thread.setPriority(int) for possible values.
jobqueue.internal.short.threads 1 Number of threads to reserve for jobs with an estimated execution time between one and ten minutes. Jobs with this setting may also use threads from the other "slower" slots.
jobqueue.internal.short.threadpriority Thread.NORM_PRIORITY - 1 The thread priority to use when executing jobs in this slot. See Thread.setPriority(int) for possible values.
jobqueue.internal.medium.threads 2 Number of threads to reserve for jobs with an estimated execution time less than one hour. Jobs with this setting may also use threads from the other "slower" slots.
jobqueue.internal.medium.threadpriority Thread.NORM_PRIORITY - 2 The thread priority to use when executing jobs in this slot. See Thread.setPriority(int) for possible values.
jobqueue.internal.long.threads 4 Number of threads to reserve for jobs with an estimated execution time more than one hour. Jobs with this setting may not use threads from the other slots.
jobqueue.internal.long.threadpriority Thread.NORM_PRIORITY - 2 The thread priority to use when executing jobs in this slot. See Thread.setPriority(int) for possible values.

Version:
2.0
Author:
Nicklas
Last modified
$Date: 2010-09-13 12:36:49 +0200 (Mon, 13 Sep 2010) $

Nested Class Summary
private static class InternalJobQueue.JobQueueKeyring
          Our own keyring containing the permissions we need to execute the jobs.
private  class InternalJobQueue.JobRunner
          Encapsulates the running of a job in a separate thread.
 
Field Summary
private  int closeTimeout
          Timeout to wait for jobs to act on the ABORT signal when shutting down BASE.
private  boolean ignoreUseInternalJobQueueFlag
          If the PluginDefinitionData.getUseInternalJobQueue() setting should be ignored or not.
private static Logger log
          Log job queue events.
private  Map<Job.ExecutionTime,Integer> maxSlots
          The maximum number of threads that are allowed in each slot.
private  Map<Job.ExecutionTime,Integer> priorities
          The thread priority to use when executing jobs in each slot.
private  Set<InternalJobQueue.JobRunner> runners
          Holds all currently executing jobs.
private  ThreadGroup runnersGroup
          The group were all job runners are placed.
private  SessionControl sc
          The job queues session controller.
private static SignalReceiver signalReceiver
          Use the local signal receiver only.
private  Map<Job.ExecutionTime,Integer> usedSlots
          The current number of threads executing in each slot.
 
Constructor Summary
InternalJobQueue()
          Create the job queue.
 
Method Summary
(package private)  void close()
          Cleanup
static SignalReceiver getSignalReceiver()
          Get the signal receiver used by the internal job queue.
private  void jobDone(InternalJobQueue.JobRunner runner)
          Called from a InternalJobQueue.JobRunner when it has finished executing the job.
 void run()
          Check the database for jobs that are waiting to be executed.
private  void sendErrorMessage(SessionControl impersonated, int jobId, Throwable ex)
           
 
Methods inherited from class java.util.TimerTask
cancel, scheduledExecutionTime
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

log

private static final Logger log
Log job queue events.


sc

private final SessionControl sc
The job queues session controller. We are logging in using our own keyring: InternalJobQueue.JobQueueKeyring.


usedSlots

private final Map<Job.ExecutionTime,Integer> usedSlots
The current number of threads executing in each slot.


maxSlots

private final Map<Job.ExecutionTime,Integer> maxSlots
The maximum number of threads that are allowed in each slot.


priorities

private final Map<Job.ExecutionTime,Integer> priorities
The thread priority to use when executing jobs in each slot.


runnersGroup

private final ThreadGroup runnersGroup
The group were all job runners are placed.


runners

private final Set<InternalJobQueue.JobRunner> runners
Holds all currently executing jobs.


ignoreUseInternalJobQueueFlag

private boolean ignoreUseInternalJobQueueFlag
If the PluginDefinitionData.getUseInternalJobQueue() setting should be ignored or not.


closeTimeout

private int closeTimeout
Timeout to wait for jobs to act on the ABORT signal when shutting down BASE. Default value is 20 seconds.


signalReceiver

private static SignalReceiver signalReceiver
Use the local signal receiver only.

Constructor Detail

InternalJobQueue

InternalJobQueue()
Create the job queue. The one and only instance is created by Application.start

Method Detail

getSignalReceiver

public static SignalReceiver getSignalReceiver()
Get the signal receiver used by the internal job queue. If the internal job queue is disabled a LocalSignalReceiver is created on the first call to this method.

Returns:
A signal receiver object
Since:
2.7

run

public void run()
Check the database for jobs that are waiting to be executed. We sort the jobs by priority and creation time and try to execute them in that order. Each job is encapsulated in a InternalJobQueue.JobRunner object which is started in it's own thread.

Specified by:
run in interface Runnable
Specified by:
run in class TimerTask

jobDone

private void jobDone(InternalJobQueue.JobRunner runner)
Called from a InternalJobQueue.JobRunner when it has finished executing the job. IT MUST NEVER FORGET TO CALL THIS METHOD.


sendErrorMessage

private void sendErrorMessage(SessionControl impersonated,
                              int jobId,
                              Throwable ex)

close

void close()
Cleanup


2.17.2: 2011-06-17