循环异常

时间:2015-12-03 14:23:19

标签: java loops exception-handling

我有一个自定义构建的API,用于与其邮件系统进行交互。但是这个API并没有给我任何方法来确认我已经建立了一个连接,除了它无法连接异常时会被抛出。

当我在连接时收到异常时,我有一个尝试重新连接到服务器的异常监听器。我希望循环异常以重试连接。执行无限循环,直到我能够连接,或直到程序关闭。我尝试使用像这样的中断标签:

reconnect: try{
    attemptReconnection();
}catch(Exception e){
    log.error(e);
    break reconnect;
}

但是我无法为我找到重新连接标签,并且有点接近使用GOTO语句而不是我愿意投入生产。

5 个答案:

答案 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)

使用Failsafe

{{1}}

使用这种方法,Failsafe会为您重试,Failsafe可以灵活地指定何时应该执行重试以及是否在重试之间延迟。