簡體   English   中英

如何等到服務器上線訪問 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) {
            }
        }
    }
}

根據需要在異常中添加日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM