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?
Advertisement
Answer
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.