如何等到服务器上线才能访问 REST API

How to wait till a server goes online to access a REST API

我正在尝试 运行 服务器启动时的 javaagent。我的代理将添加一个方法调用,用于将数据发布到同一台服务器。但是在发布数据之前,我需要使用服务器的 REST API 修改服务器的特定值。在那种情况下,嗯尝试使用以下方法向服务器的 ssl 端口发出 GET 和 POST 请求。

public static String getCurrentSchema(String connectionUrl, String username, String password)
            throws IOException {
        String currentSchema = "";

        try {
            URL url = new URL(connectionUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");
            String authString = username + ":" + password;
            String authStringEnc = new String(Base64.encodeBase64(authString.getBytes()));
            conn.setRequestProperty("Authorization", "Basic " + authStringEnc);

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    (conn.getInputStream())));
            currentSchema = br.readLine();

        }catch (Exception e){
            e.printStackTrace();
        }
        return currentSchema;
    }

当我启动服务器时,检测正常,没有任何异常。但是当服务器的其余部分开始加载时,我收到以下异常,我假设正在调用我的发布者方法并且它正在尝试使用 REST API,但它尚未开始。

有什么方法可以让我们一直监听那个端口直到它可用,然后再进行 REST 调用。或者有没有更好的方法来做到这一点。请给我一些建议....我只是不知道要搜索什么才能完成这项工作。

异常,

[2015-11-13 10:07:29,806] ERROR {org.databridge.agent.endpoint.DataEndpointConnectionWorker} -  Error while trying to connect to ssl://10.100.4.137:7711
org.databridge.agent.exception.DataEndpointSecurityException: Error while trying to connect to ssl://10.100.4.137:7711
    at org.databridge.agent.endpoint.thrift.ThriftSecureClientPoolFactory.createClient(ThriftSecureClientPoolFactory.java:61)
    at org.databridge.agent.client.AbstractClientPoolFactory.makeObject(AbstractClientPoolFactory.java:37)
    at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1212)
    at org.databridge.agent.endpoint.DataEndpointConnectionWorker.connect(DataEndpointConnectionWorker.java:92)
    at org.databridge.agent.endpoint.DataEndpointConnectionWorker.run(DataEndpointConnectionWorker.java:43)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.thrift.transport.TTransportException: Could not connect to 10.100.4.137 on port 7711
    at org.apache.thrift.transport.TSSLTransportFactory.createClient(TSSLTransportFactory.java:212)
    at org.apache.thrift.transport.TSSLTransportFactory.getClientSocket(TSSLTransportFactory.java:166)
    at org.databridge.agent.endpoint.thrift.ThriftSecureClientPoolFactory.createClient(ThriftSecureClientPoolFactory.java:56)
    ... 9 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:618)
    at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:407)
    at sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:88)
    at org.apache.thrift.transport.TSSLTransportFactory.createClient(TSSLTransportFactory.java:208)
    ... 11 more

服务器完成启动后,我反复出现以下异常。这可能是上述异常的结果吗?我应该怎么做才能解决它。请帮忙...!!

[2015-11-13 10:46:42,207]  INFO {org.databridge.agent.endpoint.DataEndpointGroup} -  No receiver is reachable at reconnection, will try to reconnect every 30 sec
[2015-11-13 10:46:42,212] ERROR {org.databridge.agent.endpoint.DataEndpointConnectionWorker} -  Could not initialize class org.apache.thrift.transport.TSocket
java.lang.NoClassDefFoundError: Could not initialize class org.apache.thrift.transport.TSocket
    at org.apache.thrift.transport.TSSLTransportFactory.createClient(TSSLTransportFactory.java:210)
    at org.apache.thrift.transport.TSSLTransportFactory.getClientSocket(TSSLTransportFactory.java:166)
    at org.databridge.agent.endpoint.thrift.ThriftSecureClientPoolFactory.createClient(ThriftSecureClientPoolFactory.java:56)
    at org.databridge.agent.client.AbstractClientPoolFactory.makeObject(AbstractClientPoolFactory.java:37)
    at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1212)
    at org.databridge.agent.endpoint.DataEndpointConnectionWorker.connect(DataEndpointConnectionWorker.java:92)
    at org.databridge.agent.endpoint.DataEndpointConnectionWorker.run(DataEndpointConnectionWorker.java:43)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
[2015-11-13 10:46:42,214] ERROR {org.databridge.agent.endpoint.DataEndpointConnectionWorker} -  Error while trying to connect to the endpoint. Cannot borrow client for ssl://10.100.4.137:7711
org.databridge.agent.exception.DataEndpointAuthenticationException: Cannot borrow client for ssl://10.100.4.137:7711
    at org.databridge.agent.endpoint.DataEndpointConnectionWorker.connect(DataEndpointConnectionWorker.java:100)
    at org.databridge.agent.endpoint.DataEndpointConnectionWorker.run(DataEndpointConnectionWorker.java:43)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.thrift.transport.TSocket
    at org.apache.thrift.transport.TSSLTransportFactory.createClient(TSSLTransportFactory.java:210)
    at org.apache.thrift.transport.TSSLTransportFactory.getClientSocket(TSSLTransportFactory.java:166)
    at org.databridge.agent.endpoint.thrift.ThriftSecureClientPoolFactory.createClient(ThriftSecureClientPoolFactory.java:56)
    at org.databridge.agent.client.AbstractClientPoolFactory.makeObject(AbstractClientPoolFactory.java:37)
    at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1212)
    at org.databridge.agent.endpoint.DataEndpointConnectionWorker.connect(DataEndpointConnectionWorker.java:92)
    ... 6 more

试试这个等待端口,

boolean check=true;
while(check) {
    Socket s = null;
    try {
        s = new Socket(host, port);
        check=false;
    } catch(ConnectionException e) {
        System.out.println("trying again...");
        try
        {
            Thread.sleep(2000);// waiting 2 seconds before next try
        }
        catch(InterruptedException ie){
        }
    } finally {
        if(s != null) {
            try {
                s.close();
            }
            catch(Exception e) {
            }
        }
    }
}

根据需要添加异常日志。