我有一个自定义构建的API,用于与其邮件系统进行交互。但是这个API并没有给我任何方法来确认我已经建立了一个连接,除了它无法连接异常时会被抛出。
当我在连接时收到异常时,我有一个尝试重新连接到服务器的异常监听器。我希望循环异常以重试连接。执行无限循环,直到我能够连接,或直到程序关闭。我尝试使用像这样的中断标签:
reconnect: try{
attemptReconnection();
}catch(Exception e){
log.error(e);
break reconnect;
}
但是我无法为我找到重新连接标签,并且有点接近使用GOTO语句而不是我愿意投入生产。
答案 0 :(得分:2)
继续这样:
do { // optional loop choice
try{
attemptReconnection();
break; // Connection was successful, break out of the loop
} catch(Exception e){
// Exception thrown, do nothing and move on to the next connection attempt (iteration)
log.error(e);
}
}while(true);
如果执行流程达到break;
指令,则表示您已成功连接。否则,它将继续进行下一次迭代。 (注意循环选择是可选的,你可以使用你想要的任何循环)
答案 1 :(得分:1)
连接成功时,attemptReconnection返回true,否则返回false。
方法attemptReconnection也应该捕获并记录异常。
然后:
while(!attemptReconnection()){
log.error("Connection failure");
}
答案 2 :(得分:1)
不能说我有使用API的经验,但我认为这样的事情会达到你想要的结果。
boolean success = false;
while (!success){
try{
attemptReconnection();
success = true;
}
catch(Exception e){
log.error(e);
}
}
attemptReconnection()
执行后没有错误,success
将设置为true并终止循环。
答案 3 :(得分:1)
我建议不要使用while循环控制重新连接尝试,而是使用预定事件。这可以轻松启动多个连接并实现后退机制,在尝试重新连接时不会过度消耗资源
<div class="parent">
<span class="descendant">Direct child. <em class="descendant">Not a direct child</em></span>
</div>
如果要关闭应用程序以避免倾斜池泄漏,请不要忘记执行private ScheduledExecutorService scheduler;
...
public void connect() {
for (int i = 0; i < numberOfConnections; i++) {
final Runnable r = new Runnable() {
int j = 1;
public void run() {
try {
final Connection connection = createNewConnection();
} catch (IOException e) {
//here we do a back off mechanism every 1,2,4,8,16... 512 seconds
final long sleep = j * 1000L;
if (j < 512) {
j *= 2;
} else {
j = 1;
}
LOGGER.error("Failed connect to host:port: {}:{}. Retrying... in {} millis",
host, port, sleep);
LOGGER.debug("{}", e);
scheduler.schedule(this, sleep, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Thread.currentThread.interrupt();
}
}
};
scheduler.schedule(r, 1, TimeUnit.SECONDS);
}
}
。
您甚至可以在连接后实现重新连接机制,并且在连接状态发生变化时让侦听器执行connect方法即可断开连接。
答案 4 :(得分:0)