2016-06-29 33 views
0

Im Pentaho-Kessel habe ich den RSS-Input-Schritt mit einigen URLs konfiguriert. Wenn ich die Transformation ausführen, wird es perfekt die meisten der Zeit, aber manchmal zeigt es die folgende Fehlermeldung:Gelegentlicher Fehler "Vorzeitiges Dateiende" beim Ausführen von RSS-Eingabe im Wasserkessel?

2016/06/29 13:10:48 - RSS Input.0 - ERROR (version 6.0.1.0-386, build 1 from 2015-12-03 11.37.25 by buildguy) : Unexpected Exception : it.sauronsoftware.feed4j.FeedXMLParseException: org.dom4j.DocumentException: Error on line -1 of document : Premature end of file. Nested exception: Premature end of file. 
2016/06/29 13:10:48 - RSS Input.0 - ERROR (version 6.0.1.0-386, build 1 from 2015-12-03 11.37.25 by buildguy) : it.sauronsoftware.feed4j.FeedXMLParseException: org.dom4j.DocumentException: Error on line -1 of document : Premature end of file. Nested exception: Premature end of file. 
2016/06/29 13:10:48 - RSS Input.0 -  at it.sauronsoftware.feed4j.FeedParser.parse(FeedParser.java:53) 
2016/06/29 13:10:48 - RSS Input.0 -  at org.pentaho.di.trans.steps.rssinput.RssInput.readNextUrl(RssInput.java:168) 
2016/06/29 13:10:48 - RSS Input.0 -  at org.pentaho.di.trans.steps.rssinput.RssInput.getOneRow(RssInput.java:198) 
2016/06/29 13:10:48 - RSS Input.0 -  at org.pentaho.di.trans.steps.rssinput.RssInput.processRow(RssInput.java:312) 
2016/06/29 13:10:48 - RSS Input.0 -  at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62) 
2016/06/29 13:10:48 - RSS Input.0 -  at java.lang.Thread.run(Thread.java:745) 
2016/06/29 13:10:48 - RSS Input.0 - Caused by: org.dom4j.DocumentException: Error on line -1 of document : Premature end of file. Nested exception: Premature end of file. 
2016/06/29 13:10:48 - RSS Input.0 -  at org.dom4j.io.SAXReader.read(SAXReader.java:482) 
2016/06/29 13:10:48 - RSS Input.0 -  at org.dom4j.io.SAXReader.read(SAXReader.java:291) 
2016/06/29 13:10:48 - RSS Input.0 -  at it.sauronsoftware.feed4j.FeedParser.parse(FeedParser.java:37) 
2016/06/29 13:10:48 - RSS Input.0 -  ... 5 more 

ich den Standard-RSS Eingabeschritt verwendet habe, der mit Kessel kommt, und hier ist der Screenshot:

enter image description here

Und die Links, die ich in RSS-Feeds konfiguriert haben, sind:

enter image description here

Wie behebe ich dieses Problem? Selbst wenn ich den RSS-Feed auf einem der Links ausführen, zeigt es gelegentlich den gleichen Fehler. Gibt es ein Problem mit diesem Plugin?

+0

Weitere Details über die Ausnahme ist hier http://StackOverflow.com/Questions/10022796/Why-am-I-Getting-This-error-premature-End-of-file – simar

+0

Es sieht aus wie einer von Ihnen Feeds oder nicht verfügbar manchmal oder Netzwerkverbindung instabil oder RSS-Server einfach Verbindung abbrechen. – simar

+1

Sie können versuchen, die Benutzer-Java-Klasse zu verwenden, um den Inhalt von rss feed manuell herunterzuladen und zu analysieren. U erhält die Kontrolle über das Verbindungs-Timeout, wie es behandelt wird, und Fehler und versucht es erneut, wenn es das erste Mal fehlschlägt. – simar

Antwort

1

Wenn es wirklich notwendig ist, den Quellcode manuell anzupassen.

Erhalten Sie einfach Quelle von feed4j. Es ist ruhig alt, also gibt es nur eine einzige Version.

Datei öffnet in Editor it.sauronsoftware.feed4j.FeedParser.java

Es einzige Methode hat parse

public static Feed parse(Url url){ 
    SAXReader saxReader = new SAXReader(); 
    Document document = saxReader.read(url); 
    ... 

Gut Personal SAXReader mehrere überladene Methode hat, eine auf sich, was u braucht

saxParser.read(InputStream is) 

Anstatt URL zu Methode lesen zu übergeben, schreiben Sie einfach Code, um Daten von URL mit httpclient zu lesen (gute Nachrichten, die es mit Kettle-Pdi aber gebündelt wird zu klären Version aussieht in $ KESSEL-HOME/lib/commons-Httpclient-xxjar)

Dann von Httpclient-Daten in ByteArrayInputSteam vom Server empfangen wickeln und es in SAXReader passiert

Build-Bibliothek und ersetzen feed4j- 1.0.mit Ihrem jar

und u getan.

Code wird so etwas wie dieses

public static Feed parse(Url url){ 
    SAXReader saxReader = new SAXReader(); 
    CloseableHttpClient client = HttpClients.createDefault(); 
    HttpGet get = new HttpGet(url); 
    CloseableHttpResponse response = client.execute(get); 
    HttpEntity entity = response.getEntity(); 
    byte[] b = new byte[(int)entity.getContentLength()]; 
    entity.getContent().read(b); 
    InputStream is = new ByteArrayInputStream(b); 

    Document document = saxReader.read(is); 
    ... 

Extra Details

  • Möglicherweise müssen Code hinzufügen möglich IOException wickeln
  • Dieser Code FeedXMLParseException diesen Server senden Sie Content-Length-Header in Reaktion übernehmen
  • mit dem richtigen jdk Version
1

Hauptproblem ist www.ft.com

Aus irgendeinem Grund nach einiger Zeit Website-Server fällt Verbindung in der Mitte, inzwischen Python-Implementierung können alle Daten von HTTP-Stream lesen und erfolgreich Daten analysieren.

Scheint mir, dass die Umsetzung der Erstellung von RSS-Antwort hat einige Fehler auf der Website.

Wasserkocher verwenden feed4j zum Parsen rss. Die Bibliothek feed4j verwendet eine einfache HttpConnection, um den Stream zu öffnen und Daten zu erhalten.

Ich habe einfachen Code für HttpConnection io Stream zu lesen und das passiert mir auch. Webserver löscht die Verbindung gelegentlich.

Anforderung an dieselbe Ressource mit Apache HttpClient funktionieren gut. Keine Fehler, alle Daten vom Server erhalten.

Meine Schätzung, Anfrage an http://ft.com benötigt ordnungsgemäß gebildete HTTP-Anfrage, wahrscheinlich einige gut ausgebildete Header.

+0

+1 für den Versuch, aber Simar, versuchte ich das gleiche RSS-Plugin mit nur dem ersten Link in URL-Screenshot (eine, die www.reuters.com trifft) und dies wirft auch gelegentlich Fehler. –

+0

Aufzeichnung www.ft.com hat falsche Verbindung. Es wird tatsächlich auf eine andere URL umgeleitet – simar