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
- Read webResult.getMessage() in the exception for the Carte-side reason the start failed.
- Confirm the Carte server is still up and reachable; check carte log for the start attempt.
- Ensure the job's required resources (DB connections, env variables) exist on the remote server.
- Verify the carteObjectId is still valid; re-register the job and start again in one flow.
- 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
- Keep register+start within one monitored flow so the carteObjectId does not expire.
- Health-check Carte before and after registration.
- Ensure remote job prerequisites (DB connections, env vars) exist on the server.
- Set explicit timeouts on SlaveServer HTTP calls.
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
- There was an error passing the exported job to the remote…
- There was an error posting the job on the remote server:
- Carte.Error.NoServerFound
- Carte.Error.NoShutdown
- A server socket allocation always has to accompanied by a…
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)