【问题标题】:How to set connection timeout and request timeout for my webservice call in java如何在java中为我的webservice调用设置连接超时和请求超时
【发布时间】:2017-01-03 20:59:31
【问题描述】:

我有一个要求,我需要与第三方网络服务进行通信以执行某些任务。

首先我需要向会话控制管理器网络服务发送登录soap请求以获取会话ID。

使用该会话 ID,我需要将执行任务的实际 soap 请求发送到 web 服务 2。

最后我需要向会话控制管理器网络服务发送注销soap请求。

我还需要为每个呼叫设置连接超时和请求超时。

  1. 我们如何设置soap webservice调用的连接超时和请求超时?
  2. 由于我将调用 Web 服务 3 次,我是否需要每次都设置连接超时/请求超时? 下面是示例代码

`

public static void main(String args[]) throws Exception {

SOAPMessage loginMessage = null;
SOAPMessage operationMessage = null;
SOAPMessage logoutMessage = null;

SOAPMessage loginResp  = null;
SOAPMessage operationResp  = null;
SOAPMessage logoutResp  = null;
String loginResponse = null;
String logoutResponse = null;
String operationResponse = null;

SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance();
/**
 * Get SOAP connection.
 */
SOAPConnection soapConnection = connectionFactory.createConnection();

//Sending Login request

loginResp=soapConnection.call(loginMessage, "https://IP:port/Login");

ByteArrayOutputStream os = new ByteArrayOutputStream();
loginResp.writeTo(os);

loginResponse = os.toString();

System.out.println("The Login call has been made");
System.out.println("The response message is : " + loginResponse);

if (checkForValidResponse(loginResponse, "LoginResponse"))
{
    System.out.println("The call is successful");

    operationResp = soapConnection.call(operationMessage, "https://IP:port/Login");

    os.reset();
    operationResp.writeTo(os);
    operationResponse = os.toString();

    System.out.println("The operation call has been made");
    System.out.println("The response message is : " + loginResponse);

    if(checkForValidResponse(operationResponse, "OperationResponse")){
        System.out.println("The operation call is successful");

    }else{
        System.out.println("The Operation Call was not successful");
    }

}else{
    System.out.println("The Login Call was not successful");

}

logoutResp=soapConnection.call(logoutMessage, "https://IP:port/Login");

os.reset();
logoutResp.writeTo(os);

logoutResponse = os.toString();

System.out.println("The Logout call has been made");
System.out.println("The response message is : " + logoutResponse);

if (checkForValidResponse(logoutResponse, "LogoutResponse"))
{
    System.out.println("The Logout call was successful");
}else{
    System.out.println("The Logout call was Unsuccessful");
}


soapConnection.close();
 }

  private static Boolean checkForValidResponse(String resp, String responseRootNode) throws Exception {

System.out.println("Expected Body Element:" +responseRootNode);

if(resp.contains(responseRootNode) && !resp.contains("Fault")){
    System.out.println("Received Valid Response" );
    return true ;

}
else{
    System.out.println("Fault found in Response");
    return false;
}
}`

【问题讨论】:

    标签: java web-services session soap


    【解决方案1】:

    创建您自己的 URLStreamHandler 以便您可以设置 URLConnection 参数,例如连接超时,读取超时

    URL 的 API 规范:

    SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
    // creating URL from string represtation
    URL endpoint = new URL(null,
          "http://example.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);
    

    【讨论】:

    • 我正在做类似的事情,但不明白你的代码和我的代码之间的区别。这是我的一段代码
    • SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = connectionFactory.createConnection(); URL loginEndPoint = new URL("http://16.18.19.11:8989/test"); URLConnection urlConnection = loginEndPoint.openConnection(); urlConnection.setConnectTimeout(60000); urlConnection.setReadTimeout(60000); loginResp=soapConnection.call(soapMessage, loginEndPoint);
    • 在设置连接超时和读取超时后,如果我们得到超时,将分配什么值来生成您的代码?结果会是空还是我们得到异常
    • 因为我需要三次调用网络服务,是否需要在每次调用之前设置此连接/读取超时?
    • 不需要每次都设置,只要将同一个endpoint实例传递给connection.call(soapMessage, endpoint);即可
    猜你喜欢
    • 2013-11-27
    • 2012-12-07
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多