![](/img/trans.png)
[英]How to call Rest Api endpoints online?How to put my code into real server
[英]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.