Class InternalJobQueue

java.lang.Object
java.util.TimerTask
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:
Internal job queue 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: 2021-06-04 12:40:45 +0200 (Fri, 04 Jun 2021) $
  • Field Details

    • log

      private static final org.slf4j.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.
    • nextStatusUpdateRequest

      private long nextStatusUpdateRequest
      Time when the next status update request for external jobs is scheduled.
    • signalReceiver

      private static SignalReceiver signalReceiver
      Use the local signal receiver only.
  • Constructor Details

    • InternalJobQueue

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

    • 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
    • checkInternalJobQueue

      private void checkInternalJobQueue()
    • requestExternalStatusUpdate

      private void requestExternalStatusUpdate()
    • 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