簡體   English   中英

如何向此 class 添加重試邏輯?

[英]How can I add retry logic to this class?

我有一個 class,這個 class 的目的是檢查我的應用程序數據庫的連接性。 如果它已連接,那么……那很好。 如果沒有,我想知道出了什么問題。

import io.dropwizard.lifecycle.Managed;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.IDBI;

@Slf4j
@RequiredArgsConstructor
public class DBCheckTask implements Managed
{
    private final IDBI dbi;
    private final String validationQuery;

    private ScheduledExecutorService runner = Executors.newSingleThreadScheduledExecutor();

    @Override
    public void start() throws Exception
    {
        int intervalSecs = 5;
        runner.scheduleAtFixedRate(this::run, intervalSecs, intervalSecs, TimeUnit.SECONDS);
    }

    @Override
    public void stop() throws Exception
    {
        runner.shutdown();
    }

    private void run()
    {
        try (Handle handle = dbi.open())
        {
            handle.execute(validationQuery);
        }
        catch (Exception e)
        {
            log.warn("Database is not healthy", e);
        }
    }
}

這工作得很好,當數據庫出現故障時,我有一個可以查看的日志。 我想做的是為這個任務添加一些重試邏輯。 我的重試邏輯如下:每 5 秒檢查一次連接(這是它已經在做的)長達一分鍾。 如果 1 分鍾后仍未自動解決,則添加日志。 之后,它應該在下一分鍾再次重置......等等。 我怎樣才能做到這一點? 我閱讀了一些關於FailSafeRetryPolicy的內容。 https://github.com/jhalterman/failsafe/blob/master/src/main/java/net/jodah/failsafe/RetryPolicy.java

想知道是否有人可以向我展示如何使用它的示例? 這對我的用例來說是一個很好的庫嗎?我可以使用我已經實現的執行器服務在單獨的線程中運行它嗎?

簡單的循環怎么樣?

  private void run()

int tries=5;
{

    while(tries-->=0){
    try (Handle handle = dbi.open())
    {
        handle.execute(validationQuery);
        return; //or breakl
    }
    catch (Exception e)
    {
        log.warn("Database is not healthy", e);
        Thread.sleep(5000); //or whatever
    }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM