私はjavax.xml.soap
API(javax.xml.soap.SOAPConnectionFactory
、javax.xml.soap.SOAPConnection
、およびその仲間たち)を使用して、リモートサーバーへのWebサービス呼び出しを行っていますが、ほとんどの場合、大成功を収めています。
ただし、問題が発生し、プログラムが永久に読み取りを停止することがあります。
これに対処するために、読み取りタイムアウトを追加したいと思います。
私はこれを達成することが可能かもしれないいくつかの方法を見つけました、しかしそれらはすべてかなり悪いようでした。
したがって、コミュニティへの私の質問は、javax.xml.soap APIを使用して呼び出しを行うときに、読み取りタイムアウト動作を実装するための最良の方法は何ですか?
独自の RLStreamHandler を作成して、接続タイムアウトや読み取りタイムアウトなどの RLConnection パラメータを設定できるようにする必要があります。
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);
わかりやすくするために、いくつかのtry/catchを削除しました。
import com.Sun.xml.internal.ws.client.BindingProviderProperties
public someResponse callWebService() {
MyPort port = new Service().getPort();
Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext();
requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 10 * 1000); //10 secs
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 1 * 60 * 1000); //1 min
return port.someWebMethod();
}