Class JobContext

java.lang.Object
org.jobrunr.jobs.context.JobContext
Direct Known Subclasses:
RunnerJobContext

public class JobContext extends Object
The JobContext class gives access to the Job id, the Job name, the state, ... .

Usage

Using the getMetadata(), it also allows to store some data between different job retries so jobs can be made re-entrant. This comes in handy when your job exists out of multiple steps, and you want to keep track of which step already succeeded. Then, in case of a failure, you can skip the steps that already completed successfully. As soon as the job is completed successfully the metadata is cleared (for storage purpose reasons).

It may also be used to keep track of the progress of a job on the Dashboard:

public void doWork(JobContext jobContext) {
 JobDashboardProgressBar progressBar = jobContext().progressBar(100);

 for(Element e : elements) {
     progressBar.increaseByOne();
 }
}

Or used for logging purposes also reported to the Dashboard:

public void doWork(JobContext jobContext) {
 jobContext.logger().info('this will appear in the dashboard');
}

Alternatively, you may use ThreadLocalJobContext.getJobContext():

public void doWork() {
 var jobContext = ThreadLocalJobContext.getJobContext();
 jobContext.logger().info('this will appear in the dashboard');
}

Note: We recommend the use of the parametric approach to avoid mistakenly calling the doWork method outside a JobRunr execution context.

Testing

To test a method that uses a JobContext, use MockThreadLocalJobContext from JobRunr's test-fixtures to set a mock JobContext.
  • Field Details

  • Constructor Details

    • JobContext

      protected JobContext()
    • JobContext

      protected JobContext(Job job)
      Keep constructor package protected to remove confusion on how to instantiate the JobContext. Tip - To use the JobContext in your Job, pass JobContext.Null
      Parameters:
      job - the job for this JobContext
  • Method Details

    • getJobId

      public UUID getJobId()
    • getJobName

      public String getJobName()
    • getJobLabels

      public List<String> getJobLabels()
    • getJobState

      public StateName getJobState()
    • getCreatedAt

      public Instant getCreatedAt()
    • getUpdatedAt

      public Instant getUpdatedAt()
    • getJobSignature

      public String getJobSignature()
    • currentRetry

      public int currentRetry()
    • amountOfFailures

      public int amountOfFailures()
    • logger

      public JobDashboardLogger logger()
    • progressBar

      public JobDashboardProgressBar progressBar(int totalAmount)
    • progressBar

      public JobDashboardProgressBar progressBar(long totalAmount)
    • getMetadata

      public Map<String,Object> getMetadata()
      Gives access to Job Metadata via an UnmodifiableMap. To save Metadata, use the saveMetadata(String, Object) method
      Returns:
      all user defined metadata about a Job. This metadata is only accessible up to the point a job succeeds.
    • saveMetadata

      public void saveMetadata(String key, Object metadata)
      Allows saving metadata for a certain Job. The value must either be a simple type (String, UUID, Integers, ...) or implement the Metadata interface for serialization to Json. Note that it is important that the objects you save are thread-safe (e.g. a CopyOnWriteArrayList, ... ).

      If the key already exists, the metadata is updated.

      Parameters:
      key - the key to store the metadata
      metadata - the metadata itself
    • saveMetadataIfAbsent

      public void saveMetadataIfAbsent(String key, Object metadata)
      Allows saving metadata for a certain Job. The value must either be a simple type (String, UUID, Integers, ...) or implement the Metadata interface for serialization to Json. Note that it is important that the objects you save are thread-safe (e.g. a CopyOnWriteArrayList, ... ).

      If the key already exists, the metadata is NOT updated.

      Parameters:
      key - the key to store the metadata
      metadata - the metadata itself
    • getMetadata

      public <T> T getMetadata(String key)
      Allows retrieving the metadata with the given key from a Job.

      Parameters:
      key - the key to retrieve the metadata
      Returns:
      the given value associated with the provided key.
    • hasCompletedStep

      public boolean hasCompletedStep(String stepName)
      Returns true if the given step has already completed successfully in a previous run.
    • runStepOnce

      public void runStepOnce(String step, Exceptions.ThrowingRunnable task) throws StepExecutionException
      Run the supplied task exactly once (i.e. only if it hasn’t already completed). If the task throws any Exception, the step won’t be marked completed.
      Parameters:
      step - the name of the step
      task - the step to execute as a Runnable
      Throws:
      StepExecutionException - when an exception happens during the execution of this step
    • runStepOnce

      public <T> T runStepOnce(String step, Exceptions.ThrowingSupplier<T> task) throws StepExecutionException
      Run the supplied task exactly once (i.e. only if it hasn’t already completed) and allow to return a result (only java classes supported by the Autoboxer or an implementation of JobContext.StepResult due to JSON Serialization). If the task throws, the step won’t be marked completed.
      Parameters:
      step - the name of the step
      task - the step to execute as a Runnable
      Returns:
      the object returned by the Exceptions.ThrowingSupplier<T> (only java classes supported by the Autoboxer or an implementation of JobContext.StepResult is supported due to JSON Serialization)
      Throws:
      StepExecutionException - when an exception happens during the execution of this step