在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输入步骤,这是截图:
我在RSS Feed中配置的链接是:
如何解决此问题?即使我在其中一个链接上运行RSS提要,它偶尔也会显示相同的错误。这个插件有问题吗?
答案 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);
...
额外细节