pentaho/pentaho-kettle · error · KettleStepException

WebServices.ERROR0005.IOException

WebServices.ERROR0005.IOException

Error message

WebServices.ERROR0005.IOException

What it means

Thrown by WebService.requestSOAP() when an java.io.IOException occurs during the HTTP request/response cycle (connection failures, stream errors) other than unknown host or invalid URI. It is wrapped in a KettleStepException with message key WebServices.ERROR0005.IOException including the service URL. This is a low-level I/O problem talking to the SOAP service.

Solutions

  1. Read the wrapped cause — it distinguishes connect timeout vs reset vs SSL errors
  2. Increase connect/read timeout values if the service is slow
  3. Verify network/firewall/TLS trust store on the Pentaho host (test with curl)
  4. Retry the transformation if the failure was transient

Example fix

// before
meta.setReadTimeOut( "1000" ); // service needs ~10s
// after
meta.setReadTimeOut( "30000" ); // raise read timeout in the step dialog
Defensive patterns

Strategy: retry

Validate before calling

// pre-flight reachability + TLS check
HttpsURLConnection c = (HttpsURLConnection) new URL( serviceUrl ).openConnection();
c.setConnectTimeout( 5000 );
try {
  c.connect();
} catch ( IOException ioe ) {
  throw new IllegalStateException( "Endpoint unreachable: " + ioe.getMessage(), ioe );
}

Try / catch

try {
  trans.execute( null );
} catch ( KettleStepException e ) {
  if ( e.getMessage() != null && e.getMessage().contains( "ERROR0005" ) ) {
    logError( "I/O error calling SOAP service: " + e.getCause() );
    // retry with backoff for transient network failures
  }
}

Prevention

When it happens

Trigger: requestSOAP() catches IOException from executing the HTTP method, reading the entity stream, or EntityUtils.toString() — e.g., connection reset, socket timeout, premature EOF, SSL handshake failures surfaced as IOException.

Common situations: Firewall dropping connections, service closing connections mid-response, read/connect timeouts on slow services, TLS certificate problems in some HttpClient versions, or network flaps in containerized deployments.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webservices/WebService.java:402

        processRows( httpEntity.getContent(), rowData, rowMeta, cachedWsdl.getWsdlTypes()
          .isElementFormQualified( cachedWsdl.getTargetNamespace() ), charSet.toString() );
      } else if ( responseCode == HttpStatus.SC_UNAUTHORIZED ) {
        throw new KettleStepException( BaseMessages.getString( PKG, "WebServices.ERROR0011.Authentication",
          cachedURLService ) );
      } else if ( responseCode == HttpStatus.SC_NOT_FOUND ) {
        throw new KettleStepException( BaseMessages.getString( PKG,
          "WebServices.ERROR0012.NotFound", cachedURLService ) );
      } else {
        throw new KettleStepException( BaseMessages.getString( PKG,
          "WebServices.ERROR0001.ServerError", Integer.toString( responseCode ),
          Const.NVL( new String( EntityUtils.toString( httpEntity, charSet.toString() ) ), "" ), cachedURLService ) );
      }
      // requestTime += Const.nanoTime() - currentRequestTime;
    } catch ( UnknownHostException e ) {
      throw new KettleStepException( BaseMessages
        .getString( PKG, "WebServices.ERROR0013.UnknownHost", cachedURLService ), e );
    } catch ( IOException e ) {
      throw new KettleStepException( BaseMessages
        .getString( PKG, "WebServices.ERROR0005.IOException", cachedURLService ), e );
    } catch ( URISyntaxException e ) {
      throw new KettleStepException( BaseMessages.getString( PKG, "WebServices.ERROR0002.InvalidURI",
        cachedURLService ), e );
    } finally {
      data.argumentRows.clear(); // ready for the next batch.
      if ( vHttpMethod != null ) {
        vHttpMethod.releaseConnection();
      }
    }
  }

  private void initWsdlEnv() throws KettleException {
    if ( meta.equals( cachedMeta ) ) {
      return;
    }
    cachedMeta = meta;

View on GitHub (pinned to f3058517a1)