Pawan
Pawan

Reputation: 32321

URL set Connection Timeout is not working

I am using rss feeds to get latest news and i get a XML response back

The issue i am facng is that in case if it takes longer than 5 seconds i just want the program to be stopped this is my code (for testing purpose i have set time to 1 second)

public static void main(String args[]) {
     Connection dbConnection = null;
     PreparedStatement inserpstmt = null;
     try {
      final JSONArray latestnews = new JSONArray();
      builder = getDocumentBuilderInstance();
      final URL url = new URL("http://www.rssmix.com/u/8171434/rss.xml");
      url.openConnection().setConnectTimeout(1000);
      url.openConnection().setReadTimeout(1000);
      final Document doc = builder.parse(url.openStream());
      final NodeList items = doc.getElementsByTagName("item");
      for (int i = 0; i < items.getLength(); i++) {
       final Element item = (Element) items.item(i);
       final String title = getValue(item, "title");
       System.out.println(title);
      }
     } catch (Exception e) {
      e.printStackTrace();
      e.getMessage();
     } catch (Throwable e) {
      e.getMessage();
      e.printStackTrace();
     } finally {
     }
    }

But could you please let me know why this isn't being stopped and waiting for more than 1 second

Edited Code

StringBuffer sb = new StringBuffer("http://www.rssmix.com/u/8171434/rss.xml");
            URLConnection conn = new URL(sb.toString()).openConnection();
            conn.setConnectTimeout(7000);
            conn.setReadTimeout(7000);
            final   Document doc = builder.parse(new InputSource(conn.getInputStream()));

Upvotes: 0

Views: 1396

Answers (2)

Rahul
Rahul

Reputation: 317

In the above code each time when you call openConnection, you get a new Connection object. Also finally you are using openStream which is equivalent to openConnection().getInputStream(). So all the timeouts are on different connection object and finally there is no timeout set on the connection object from where inputstream is taken. That is why it was not working. Below code will work as timeouts are present on same object from where InputStream is retrieved.

URLConnection connection = url.openConnection();
connection.setConnectTimeout(1000);
connection.setReadTimeout(1000);
connection.connect();

Upvotes: 0

DominicEU
DominicEU

Reputation: 3631

You should probably approach this in the following fashion.

final URL url = new URL("http://www.rssmix.com/u/8171434/rss.xml");
URLConnection urlConn = url.openConnection();
urlConn.setConnectTimeout(1000);
urlConn.setReadTimeout(1000);

final Document doc = builder.parse(urlConn.getInputStream());

Upvotes: 1

Related Questions