2016-02-29 85 views
0

我开始有一个休息界面Netty。我得到这个例外:当检查Netty服务器是否启动时替代睡眠?

javax.ws.rs.ProcessingException: RESTEASY004655: Unable to invoke request 
    at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:287) 
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:436) 
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:102) 
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:64) 
    at com.sun.proxy.$Proxy20.ping(Unknown Source) 
    at com.openet.atf.agent.proxy.SlaveRemoteProxy.ping(SlaveRemoteProxy.java:41) 
    at com.openet.atf.agent.manage.Master.startSlaves(Master.java:86) 
    at com.openet.acceptance.runner.AcceptanceRunner.main(AcceptanceRunner.java:195) 
Caused by: org.apache.http.conn.HttpHostConnectException: Connection to http://ovm1:8889 refused 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:190) 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
    at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283) 
    ... 7 more 
Caused by: java.net.ConnectException: Connection refused 

我通过做一个Thread.sleep(5000);阻止了这种情况的发生。我正在寻找更好的替代sleep。睡眠总是假定时间长度是5秒。

+1

“睡眠总是假定的时间长度为5秒” - 那是好还是坏关于你的要求是什么?您是否考虑过Quartz Scheduler或ScheduledExecutorService? – Fildor

+0

您是否正在连接到本地(如在应用程序中)REST服务,并且您希望在继续之前等待其启动并运行,或者您是否试图连接到可能运行或可能不运行的外部应用程序?还是我有完全错误的问题? –

+0

如果它在4秒内出现,我不想睡5秒,如果需要10秒钟,那么5秒不够长。使用超时并不是真正可靠的方法来检查它是否已启动。轮询一些东西会更好。我正在连接到我在远程节点上启动的Netty REST服务。 – eeijlar

回答

1

您可以睡觉,直到连接建立。

boolean up = false; 
while (!up) { 
    try { 
     // Try to connect 
     up = true; 
    } catch (Exception e) { 
     Thread.sleep(5000); 
    } 
} 
2

在成功可能在未来任何时候的情况下使用的一种常用方法是back off pattern,通常通过加倍等待时间每次迭代实现。

事情是这样的:

long wait = 50; // ms 
boolean connected; 
while (!connected) { 
    Thread.sleep(wait); 
    connected = <code to check connection> 
    wait *= 2; 
} 
相关问题