在对本地bitcoind的四个请求之后的SocketTimeoutException

时间:2014-04-20 09:26:30

标签: java htmlunit bitcoind

我想使用java连接到bitcoind。我的计划是使用htmlunit和gson。现在我可以成功完成一个请求。但是,由于在第五个请求时抛出了SocketTimeoutException,因此我无法完成四个后续请求。

我试过了:

  • 请求之间等待。 (没有效果可见)
  • 强制失败的http状态代码,例如请求getinfoo代替getinfo。 (我的在四次失败的请求后获得超时)

感谢任何帮助或评论!

package test;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.google.gson.Gson;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.URL;

public class Test {

    public static void main(String[] args) {

        WebClient client = new WebClient(BrowserVersion.FIREFOX_24);

        // http://[bitcoind-user]:[password]@localhost:[bitcoind-port]
        String baseUrl = "http://admin:admin@localhost:8332/";

        client.getOptions().setTimeout(2000);
        while (true) {
            try {
                WebRequest req = new WebRequest(new URL(baseUrl));
                req.setAdditionalHeader("Content-type", "application/json");
                req.setHttpMethod(HttpMethod.POST);

                JSONRequestBody body = new JSONRequestBody();
                body.setMethod("getinfo");
                req.setRequestBody(new Gson().toJson(body, JSONRequestBody.class));

                client.getPage(req);
                client.closeAllWindows();

                System.out.println("ok. (No Exception)");

            } catch (SocketTimeoutException tex) {
                System.out.println("not ok: SocketTimeoutException");
            } catch (IOException ex) {
                System.out.println("not ok: IOException");
            } catch (FailingHttpStatusCodeException hex) {
                System.out.println("not ok: FailingHttpStatusCodeException");
            }
        }
    }
}

(编辑:)

删除.setTimeout(2000)也无济于事。衡量每个请求的时间表明它们非常快:

ok. (No Exception)             Timer:  1.161 seconds
ok. (No Exception)             Timer:  0.112 seconds
ok. (No Exception)             Timer:  0.115 seconds
ok. (No Exception)             Timer:  0.075 seconds
not ok: SocketTimeoutException Timer: 90.119 seconds
not ok: SocketTimeoutException Timer: 90.145 seconds
not ok: SocketTimeoutException Timer: 90.134 seconds

使用curl在终端中多次重复相同的请求时间总是不到一秒,因此bitcoind不应该导致问题。

1 个答案:

答案 0 :(得分:0)

首先,尝试删除此行:

client.getOptions().setTimeout(2000);

如果客户端需要2秒或更长时间来处理第五个请求,则显然会因超时异常而失败。

其次,如果您真的不需要,请确保禁用JavaScript,因为处理过程也需要2秒以上。