pentaho/pentaho-kettle · warning · KettleException

JobEntryFTPS.JobStopped

JobEntryFTPS.JobStopped

Error message

JobEntryFTPS.JobStopped

What it means

JobEntryFTPSGet throws this KettleException when the parent Kettle job has been signaled to stop while the entry is still iterating over the remote file list returned by the FTPS server. Kettle job entries must abort promptly on stop requests, so each loop iteration checks parentJob.isStopped() and fails the entry instead of continuing to download. The message is a messages-property key (JobEntryFTPS.JobStopped), so the literal text is resolved from the plugin's message bundle.

Solutions

  1. This is expected cancellation behavior: wrap the entry execution in your runner's stop-handling logic and treat KettleException with the stopped flag set as an abort, not a config error.
  2. Reduce the per-file work or batch size so the loop reaches the isStopped() check more often and cancels faster.
  3. If it fires without a stop request, check for code paths that call job.stopAll() (e.g., success-condition logic or alerts) and correct the job flow conditions.

Example fix

// before: entry fails the whole job on cancel
result.setResult( true ); // assuming downloads always finish
// after: check stop before launching the entry and handle abort gracefully
if ( job.isStopped() ) { result.setResult( false ); result.setStopped( true ); return; }
Defensive patterns

Strategy: try-catch

Validate before calling

if ( job != null && job.isStopped() ) { return; // don't start the FTPS get at all }

Try / catch

try {
  jobEntry.execute( result, executionContext );
} catch ( KettleException e ) {
  if ( job.isStopped() ) { result.setStopped( true ); log.info( "FTPS get aborted by stop request: " + e.getMessage() ); }
  else { throw e; }
}

Prevention

When it happens

Trigger: Calling execute() on JobEntryFTPSGet (via a running Kettle job) while the job is stopped mid-run: specifically during the for-loop over fileList after downloading some files, a user hits Stop in Spoon or the job's stop flag is set, and parentJob.isStopped() returns true at the top of the next iteration.

Common situations: Long-running FTPS get operations with many files that users cancel via the Stop button; scheduled jobs killed by a timeout; pipelines halted downstream that propagate the stop to this entry between file transfers.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/dfea2cbc62a2ea80. Report an issue: GitHub.

Appendix: source

Thrown at plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/JobEntryFTPSGet.java:842

    }

    displayResults();

    return result;
  }

  private void downloadFiles( FTPSConnection connection, String folder, Pattern pattern, Result result )
    throws KettleException {

    List<FTPFile> fileList = connection.getFileList( folder );
    if ( isDetailed() ) {
      logDetailed( BaseMessages.getString( PKG, "JobEntryFTPS.FoundNFiles", fileList.size() ) );
    }

    for ( int i = 0; i < fileList.size(); i++ ) {

      if ( parentJob.isStopped() ) {
        throw new KettleException( BaseMessages.getString( PKG, "JobEntryFTPS.JobStopped" ) );
      }

      if ( successConditionBroken ) {
        throw new KettleException( BaseMessages.getString( PKG, "JobEntryFTPS.SuccesConditionBroken", NrErrors ) );
      }

      FTPFile file = fileList.get( i );
      if ( isDetailed() ) {
        logDetailed( BaseMessages.getString(
          PKG, "JobEntryFTPS.AnalysingFile", file.getPath(), file.getName(), file.getMode(), file
            .getDate().toString(), file.getFileType() == 0 ? "File" : "Folder", String
            .valueOf( file.getSize() ) ) );
      }

      if ( !file.isDirectory() && !file.isLink() ) {
        // download file
        boolean getIt = true;
        if ( getIt ) {

View on GitHub (pinned to f3058517a1)