javasaaj

Setting socket read timeout with javax.xml.soap.SOAPConnection


I am using the javax.xml.soap API (javax.xml.soap.SOAPConnectionFactory, javax.xml.soap.SOAPConnection, and friends) to make a web service call to a remote server, for the most part with great success.

However, sometimes there is a problem and the program gets stuck reading forever.

To address this, I'd like to add a read timeout.

I found several ways it might be possible to achieve this, but they all seemed pretty bad.

So my question to the community is: What is the best way to implement a read timeout behaviour when using the javax.xml.soap API to make a call?


Solution

  • You have to create your own URLStreamHandler so that you can set URLConnection parameters like connection timeout and read timeout.

    SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
    URL endpoint =
      new URL(new URL("http://yourserver.yourdomain.com/"),
              "/path/to/webservice",
              new URLStreamHandler() {
                @Override
                protected URLConnection openConnection(URL url) throws IOException {
                  URL target = new URL(url.toString());
                  URLConnection connection = target.openConnection();
                  // Connection settings
                  connection.setConnectTimeout(10000); // 10 sec
                  connection.setReadTimeout(60000); // 1 min
                  return(connection);
                }
              });
    
    SOAPMessage result = connection.call(soapMessage, endpoint);
    

    I have removed some try/catch for clarity.