偶尔"文件过早结束"在水壶中运行RSS输入时出错?

时间:2016-06-29 08:08:11

标签: rss pentaho kettle pentaho-spoon

在pentaho水壶中,我使用一些URL配置了RSS输入步骤。当我运行转换时,它在大多数时间运行完美,但有时,它会显示以下错误:

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

我使用了水壶附带的默认RSS输入步骤,这是截图:

enter image description here

我在RSS Feed中配置的链接是:

enter image description here

如何解决此问题?即使我在其中一个链接上运行RSS提要,它偶尔也会显示相同的错误。这个插件有问题吗?

2 个答案:

答案 0 :(得分:1)

主要问题是www.ft.com

由于某种原因经过一段时间网站服务器在中间断开连接,同时python实现能够从http流中读取所有数据并成功解析数据。

在我看来,构建rss响应的实现在网站上有一些bug。

Kettle使用feed4j来解析rss。库feed4j利用简单的HttpConnection打开流并获取数据。

我做了简单的代码来读取HttpConnection io流,同样的事情发生在我身上。 Web服务器偶尔会丢弃连接。

使用Apache HttpClient请求相同的资源可以正常工作。没有错误,从服务器收到的所有数据。

我的猜测,对http://ft.com的请求需要正确形成的http请求,最有可能是一些格式正确的标头。

答案 1 :(得分:1)

如果确实需要手动调整源代码。

获取feed4j的来源。它很安静,所以只有单一版本。

在编辑器中打开文件it.sauronsoftware.feed4j.FeedParser.java

它有单一方法parse

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

优秀的员工SAXReader有几个重载方法,其中一个是你需要的

   saxParser.read(InputStream is)

不是将url传递给方法读取,而是使用httpclient编写代码来从url读取数据(好消息是它与kettle-pdi捆绑在一起,但澄清版本请查看 $ KETTLE-HOME / lib / commons-httpclient -xxjar

然后通过httpclient数据从服务器接收包装到ByteArrayInputSteam并将其传递给SaxReader

构建库并将feed4j-1.0.jar替换为您的

你完成了。

代码将是这样的

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);
    ...

额外细节

  • 可能需要添加代码以将可能的IOException包装到FeedXMLParseException
  • 此代码假定服务器在响应中发布Content-Length标头
  • 使用匹配的jdk版本