pentaho/pentaho-kettle · error · KettleException

There was an error starting the job on the remote server:

Error message

There was an error starting the job on the remote server: 

What it means

After registering the job remotely, sendToSlaveServer() invokes StartJobServlet via slaveServer.execService(...). If the returned WebResult is not OK, or the service call itself throws, the library throws a KettleException with this message. The job was registered on the Carte server but could not be started there.

Solutions

  1. Read webResult.getMessage() in the exception for the Carte-side reason the start failed.
  2. Confirm the Carte server is still up and reachable; check carte log for the start attempt.
  3. Ensure the job's required resources (DB connections, env variables) exist on the remote server.
  4. Verify the carteObjectId is still valid; re-register the job and start again in one flow.
  5. Check network/proxy between client and Carte for request tampering or timeouts.

Example fix

// before
String reply = slaveServer.execService(StartJobServlet.CONTEXT_PATH + "/?name=" + ...);
// after: guard connectivity before start
if (!slaveServer.ping()) {
  throw new IllegalStateException("Carte down before start; re-register required");
}
String reply = slaveServer.execService(StartJobServlet.CONTEXT_PATH + "/?name=" + ...);
Defensive patterns

Strategy: retry

Validate before calling

if (!slaveServer.ping()) {
  throw new IllegalStateException("Carte down; cannot start job remotely");
}

Try / catch

try {
  return Job.sendToSlaveServer(jobMeta, execCfg, repo, metaStore);
} catch (KettleException e) {
  if (isTransient(e)) {
    return retryStart(jobMeta, execCfg, repo, metaStore, 2);
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling sendToSlaveServer where execService(StartJobServlet...) returns non-OK (remote start rejected, job ID unknown/expired, server-side start error) or the HTTP call throws (connection refused, timeout, malformed XML reply).

Common situations: Carte server shut down between register and start; job failed instantly on the server (missing DB connections not defined there); firewall blocks the start call; XML reply corrupted by a proxy.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/Job.java:1783

        String xml = new JobConfiguration( jobMeta, executionConfiguration ).getXML();

        String reply = slaveServer.sendXML( xml, RegisterJobServlet.CONTEXT_PATH + "/?xml=Y" );
        WebResult webResult = WebResult.fromXMLString( reply );
        if ( !webResult.getResult().equalsIgnoreCase( WebResult.STRING_OK ) ) {
          throw new KettleException( "There was an error posting the job on the remote server: " + Const.CR + webResult
              .getMessage() );
        }
        carteObjectId = webResult.getId();
      }

      // Start the job
      //
      String reply =
          slaveServer.execService( StartJobServlet.CONTEXT_PATH + "/?name=" + URLEncoder.encode( jobMeta.getName(),
              "UTF-8" ) + "&xml=Y&id=" + carteObjectId );
      WebResult webResult = WebResult.fromXMLString( reply );
      if ( !webResult.getResult().equalsIgnoreCase( WebResult.STRING_OK ) ) {
        throw new KettleException( "There was an error starting the job on the remote server: " + Const.CR + webResult
            .getMessage() );
      }
      return carteObjectId;
    } catch ( KettleException ke ) {
      throw ke;
    } catch ( Exception e ) {
      throw new KettleException( e );
    }
  }

  public void addJobListener( JobListener jobListener ) {
    synchronized ( jobListeners ) {
      jobListeners.add( jobListener );
    }
  }

  public void addJobEntryListener( JobEntryListener jobEntryListener ) {
    jobEntryListeners.add( jobEntryListener );

View on GitHub (pinned to f3058517a1)