如何等到服務器上線才能訪問 REST API (How to wait till a server goes online to access a REST API)


問題描述

如何等到服務器上線才能訪問 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

參考解法

方法 1:

Try this to wait for the port,

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) {
            }
        }
    }
}

Add logs in exception as necessary.

(by udaniPraminda)

參考文件

  1. How to wait till a server goes online to access a REST API (CC BY‑SA 2.5/3.0/4.0)

#java #port #REST #SSL






相關問題

電子郵件地址中帶有 + 字符的 Java 郵件 (Java mail with + character in email address)

如何快速原型化 Java 代碼? (How to quickly prototype Java code?)

如何使用 Maven 在目標(SVN-)服務器上創建 Javadoc? (How to create Javadoc on the target (SVN-) server using Maven?)

為什麼檢查二叉樹有效性的解決方案不起作用? (Why the solution for checking the validity of binary tree is not working?)

Selenium webdriver通過第一個數字找到texy (Selenium webdriver find texy by first digits)

setOnClickListener 沒有在圖像視圖上被調用 (setOnClickListener is not getting called on image view)

繪製多邊形:找不到錯誤 (Drawing Polygon : unable to find error)

半透明 JButton:對像出現在背景中 (Semi-Transparent JButton: Objects appear in Background)

比較同一數組的元素 (Compare elements of the same array)

Java 屏幕截圖小程序 (Java screen capture applet)

Minecraft 1.8.9 Forge Modding 的Java 開發工具包,需要什麼JDK/JRE,代碼是否正確? (Java Development Kit with Minecraft 1.8.9 Forge Modding, What JDK/JRE Is Needed, Is Code Correct?)

java while (resultset.next()) 不返回同一列中的所有數據 (java while (resultset.next()) does not return all data in the same column)







留言討論