【发布时间】:2017-09-02 21:54:16
【问题描述】:
在我的应用程序中,有一个单独的线程,由 ScheduledExecutorService.scheduleAtFixedRate() 每分钟运行一次,它解析来自多个网站的 rss 提要。我正在使用 Apache HttpClient 来接收 xml。
示例代码:
InputStream inputStream = HTTPClient.get(url);
String xml = inputStreamToString(inputStream, encoding, websiteName);
public static String inputStreamToString(InputStream inputStream, String encoding, String websiteName)
{
BufferedReader bufferedReader = null;
PrintWriter printWriter = null;
StringBuilder stringBuilder = new StringBuilder();
int letter;
try
{
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, encoding));
printWriter = new PrintWriter(new File("src/doclog/"
+ websiteName + "_"
+ new SimpleDateFormat("MM_dd_yyyy_hh_mm_ss").format(new Date(System.currentTimeMillis()))
+ "_" + encoding + ".txt"), encoding);
while((letter = bufferedReader.read()) != -1)
{
char character = (char) letter;
printWriter.print(character);
stringBuilder.append(character);
}
}
catch(IOException e)
{
throw new RuntimeException(e);
}
finally
{
try
{
if(bufferedReader != null)
{
bufferedReader.close();
}
if(printWriter != null)
{
printWriter.close();
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
System.out.println("String built");
return stringBuilder.toString();
}
和 HTTPClient 类:
public class HTTPClient
{
private static final HttpClient CLIENT = HttpClientBuilder.create().build();
public static InputStream get(String url)
{
try
{
HttpGet request = new HttpGet(url);
HttpResponse response = CLIENT.execute(request);
System.out.println("Response Code: " + response.getStatusLine().toString());
return response.getEntity().getContent();
}
catch(IOException | IllegalArgumentException e)
{
throw new RuntimeException(e);
}
}
}
正如标题所说,有时bufferedReader.readLine() 有可能永远挂起。我已经看到有关此主题的另一个答案,他们建议检查bufferedReader.ready() 是否返回true。问题是有些网站在处理它们时总是会在bufferedReader.ready() 中返回false,但是它们解析得很好。
如何防止我的线程挂在 bufferedReader.readLine() 上?
如果重要,response.getStatusLine().toString() 总是返回 HTTP/1.1 200 OK
编辑
我刚刚发现 bufferedReader.ready() 在挂起时实际上是 true。
编辑 2
BufferedReader.read() 也挂起。奇怪的是,只有在处理一个网站时才会发生挂起,而且它的发生是绝对随机的。应用程序要么工作 15 小时,收到数百个无问题的响应,要么在启动后 10 分钟内挂起。我已经开始将每个更新的所有字符写入单独的文件中,并发现并没有真正发生什么特别的事情。 Xml 读取在文档中间永远停止,最后一个字符是<p dir="ltr"&g。更新了代码。
另外,值得注意的是,不能有任何未处理的异常,因为在我的ScheduledExecutorService.scheduleAtFixedRate() runnable 的最高级别,我捕获了Throwable,并打印它的stackTrace。
【问题讨论】:
标签: java apache rss httpclient bufferedreader