Как использовать Pentaho Kettle, как автоматически повторять запросы на перерыв, которые не выполняются из-за ошибок соединения? - PullRequest
19 голосов
/ 29 ноября 2011

Как мы можем сделать повторные запросы Pentaho на ошибки соединения?

У нас есть система Pentaho BI, которая, среди многочисленных источников данных, запрашивает определенный API REST для более чем 20 000 вариантов запросов при каждом запуске.

Как и ожидалось, на большинстве запусков некоторые из этих запросов не будут выполнены из-за ошибок соединения. Они обычно проявляются в журнале Пентахо как org.pentaho.di.core.exception.KettleException из-за javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake, в конечном счете вызванного java.io.EOFException: SSL peer shut down incorrectly.

После изучения Интернета и форумов Пентахо мы не можем найти никаких инструкций по добавлению простого подхода к повторным попыткам в таких случаях, как этот. Волосы рвутся.

Помоги мне StackOverflow, ты моя единственная надежда!

Обновление 1: StackTrace:

ERROR 29-11 11:02:17,659 - B - org.pentaho.di.core.exception.KettleException:
Can not result from [https://<DOMAIN>/<PATH>?<PARAMS>]
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake    
    at org.pentaho.di.trans.steps.rest.Rest.callRest(Rest.java:190)
    at org.pentaho.di.trans.steps.rest.Rest.processRow(Rest.java:385)
    at org.pentaho.di.trans.step.RunThread.run(RunThread.java:40)
    at java.lang.Thread.run(Thread.java:662)
Caused by: com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    at com.sun.jersey.client.apache.DefaultApacheHttpMethodExecutor.executeMethod(DefaultApacheHttpMethodExecutor.java:213)
    at com.sun.jersey.client.apache.ApacheHttpClientHandler.handle(ApacheHttpClientHandler.java:175)
    at com.sun.jersey.api.client.filter.HTTPBasicAuthFilter.handle(HTTPBasicAuthFilter.java:81)
    at com.sun.jersey.api.client.Client.handle(Client.java:648)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:191)
    at org.pentaho.di.trans.steps.rest.Rest.callRest(Rest.java:141)
    ... 3 more
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:817)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:632)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
    at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827)
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.flushRequestOutputStream(MultiThreadedHttpConnectionManager.java:1525)
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
    at com.sun.jersey.client.apache.DefaultApacheHttpMethodExecutor.executeMethod(DefaultApacheHttpMethodExecutor.java:210)
    ... 9 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
    at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
    ... 22 more

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

или используйте обработку ошибок шага на шаге остального клиента и перенаправьте поля ошибок на другой шаг остального клиента.

очевидно, что это позволяет вам повторить попытку столько раз, сколько у вас есть шагов, но нет смысла повторять попыткув любом случае, более одного раза.

0 голосов
/ 30 ноября 2011

Используйте источник, Люк.

В org.pentaho.di.trans.steps.rest.Rest.processRow (Rest.java:385) вы найдете

    } catch(KettleException e) {
         boolean sendToErrorRow=false;
         String errorMessage = null;

        if (getStepMeta().isDoingErrorHandling()){
             sendToErrorRow = true;
             errorMessage = e.toString();
        } else {
            logError(BaseMessages.getString(PKG, "Rest.ErrorInStepRunning")+e.getMessage()); //$NON-NLS-1$
            setErrors(1);
            logError(Const.getStackTracker(e));
            stopAll();
            setOutputDone();  // signal end to receiver(s)
            return false;
        }

        if (sendToErrorRow) {
           // Simply add this row to the error row
           putError(getInputRowMeta(), r, 1, errorMessage, null, "Rest001");
        }

    }

Похоже, что вы можете настроить обработку ошибок на основе строк. Похоже, это то, что вы после.

...