Class SystemCommandTasklet

java.lang.Object
org.springframework.batch.core.step.tasklet.SystemCommandTasklet
All Implemented Interfaces:
StoppableTasklet, Tasklet, StepExecutionListener, StepListener, org.springframework.beans.factory.InitializingBean

public class SystemCommandTasklet extends Object implements StepExecutionListener, StoppableTasklet, org.springframework.beans.factory.InitializingBean
Tasklet that executes a system command.

The system command is executed asynchronously using injected setTaskExecutor(TaskExecutor) - timeout value is required to be set, so that the batch job does not hang forever if the external process hangs.

Tasklet periodically checks for termination status (i.e. setCommand(String...) finished its execution or setTimeout(long) expired or job was interrupted). The check interval is given by setTerminationCheckInterval(long).

When job interrupt is detected tasklet's execution is terminated immediately by throwing JobInterruptedException.

setInterruptOnCancel(boolean) specifies whether the tasklet should attempt to interrupt the thread that executes the system command if it is still running when tasklet exits (abnormally).

Author:
Robert Kasanicky, Will Schipp, Mahmoud Ben Hassine
  • Field Details

    • logger

      protected static final org.apache.commons.logging.Log logger
  • Constructor Details

    • SystemCommandTasklet

      public SystemCommandTasklet()
  • Method Details

    • execute

      @Nullable public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
      Execute system command and map its exit code to ExitStatus using SystemProcessExitCodeMapper.
      Specified by:
      execute in interface Tasklet
      Parameters:
      contribution - mutable state to be passed back to update the current step execution
      chunkContext - attributes shared between invocations but not between restarts
      Returns:
      an RepeatStatus indicating whether processing is continuable. Returning null is interpreted as RepeatStatus.FINISHED
      Throws:
      Exception - thrown if error occurs during execution.
    • setCommandRunner

      public void setCommandRunner(CommandRunner commandRunner)
      Injection setter for the CommandRunner.
      Parameters:
      commandRunner - CommandRunner instance to be used by SystemCommandTasklet instance. Defaults to JvmCommandRunner.
      Since:
      5.0
    • setCommand

      public void setCommand(String... command)
      Set the command to execute along with its arguments. For example:
      setCommand("myCommand", "myArg1", "myArg2");
      Parameters:
      command - command to be executed in a separate system process.
    • setEnvironmentParams

      public void setEnvironmentParams(String[] envp)
      Parameters:
      envp - environment parameter values, inherited from parent process when not set (or set to null).
    • setWorkingDirectory

      public void setWorkingDirectory(String dir)
      Parameters:
      dir - working directory of the spawned process, inherited from parent process when not set (or set to null).
    • afterPropertiesSet

      public void afterPropertiesSet() throws Exception
      Specified by:
      afterPropertiesSet in interface org.springframework.beans.factory.InitializingBean
      Throws:
      Exception
    • setJobExplorer

      public void setJobExplorer(JobExplorer jobExplorer)
    • setSystemProcessExitCodeMapper

      public void setSystemProcessExitCodeMapper(SystemProcessExitCodeMapper systemProcessExitCodeMapper)
      Parameters:
      systemProcessExitCodeMapper - maps system process return value to ExitStatus returned by Tasklet. SimpleSystemProcessExitCodeMapper is used by default.
    • setTimeout

      public void setTimeout(long timeout)
      Timeout in milliseconds.
      Parameters:
      timeout - upper limit for how long the execution of the external program is allowed to last.
    • setTerminationCheckInterval

      public void setTerminationCheckInterval(long checkInterval)
      The time interval how often the tasklet will check for termination status.
      Parameters:
      checkInterval - time interval in milliseconds (1 second by default).
    • beforeStep

      public void beforeStep(StepExecution stepExecution)
      Get a reference to StepExecution for interrupt checks during system command execution.
      Specified by:
      beforeStep in interface StepExecutionListener
      Parameters:
      stepExecution - instance of StepExecution.
    • setTaskExecutor

      public void setTaskExecutor(org.springframework.core.task.TaskExecutor taskExecutor)
      Sets the task executor that will be used to execute the system command NB! Avoid using a synchronous task executor
      Parameters:
      taskExecutor - instance of TaskExecutor.
    • setInterruptOnCancel

      public void setInterruptOnCancel(boolean interruptOnCancel)
      If true tasklet will attempt to interrupt the thread executing the system command if setTimeout(long) has been exceeded or user interrupts the job. false by default
      Parameters:
      interruptOnCancel - boolean determines if process should be interrupted
    • stop

      public void stop()
      Will interrupt the thread executing the system command only if setInterruptOnCancel(boolean) has been set to true. Otherwise the underlying command will be allowed to finish before the tasklet ends.
      Specified by:
      stop in interface StoppableTasklet
      Since:
      3.0
      See Also: