如何等到服务器上线才能访问 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) {
}
}
}
}
根据需要添加异常日志。
我正在尝试 运行 服务器启动时的 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) {
}
}
}
}
根据需要添加异常日志。