Package net.sf.basedb.core
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 perJob.ExecutionTime
setting. The configuration is done in thebase.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: 2018-11-02 08:45:02 +0100 (fr, 02 nov 2018) $
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description 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
Fields Modifier and Type Field Description private int
closeTimeout
Timeout to wait for jobs to act on the ABORT signal when shutting down BASE.private boolean
ignoreUseInternalJobQueueFlag
If thePluginDefinitionData.getUseInternalJobQueue()
setting should be ignored or not.private static org.slf4j.Logger
log
Log job queue events.private Map<Job.ExecutionTime,Integer>
maxSlots
The maximum number of threads that are allowed in each slot.private long
nextStatusUpdateRequest
Time when the next status update request for external jobs is scheduled.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
Constructors Constructor Description InternalJobQueue()
Create the job queue.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
checkInternalJobQueue()
(package private) void
close()
Cleanupstatic SignalReceiver
getSignalReceiver()
Get the signal receiver used by the internal job queue.private void
jobDone(InternalJobQueue.JobRunner runner)
Called from aInternalJobQueue.JobRunner
when it has finished executing the job.private void
requestExternalStatusUpdate()
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
-
-
-
-
Field Detail
-
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 thePluginDefinitionData.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.
-
-
Method Detail
-
getSignalReceiver
public static SignalReceiver getSignalReceiver()
Get the signal receiver used by the internal job queue. If the internal job queue is disabled aLocalSignalReceiver
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 aInternalJobQueue.JobRunner
object which is started in it's own thread.
-
checkInternalJobQueue
private void checkInternalJobQueue()
-
requestExternalStatusUpdate
private void requestExternalStatusUpdate()
-
jobDone
private void jobDone(InternalJobQueue.JobRunner runner)
Called from aInternalJobQueue.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
-
-