java實現網絡請求超時自動熔斷


原文:https://www.jianshu.com/p/326465500d1c?utm_campaign

使用場景

之前在實現熔斷降級組件時,需要實現一個接口的超時中斷,意思是,業務在使用熔斷降級功能時,在平台上設置了一個超時時間,如果在請求進入熔斷器開始計時,並且接口在超時時間內沒有響應,則需要提早中斷該請求並返回。
比如正常下游接口的超時時間為800ms,但是因為自身業務的特殊需求,最多只能等200ms,如果200ms之內沒有數據返回,則返回降級數據。這里處理請求的線程可以看成是tomcat線程池中的一個線程,如果通過線程池返回的Future,可以很輕松的實現超時返回。
超過自己的預設值,直接返回失敗,並且記錄一下失敗日志,可以自己決定是否需要重試。

主要方法

因為需要有返回值,但是實現 Runable ,重寫 run 方法沒有返回值,
所以我們采用實現Callable的方式,重寫 call 方法就行
如何得到返回值呢?
task.get()
注意的是,默認不設置時間,這個是無限等待堵塞在那里的。
所以還提供了另外的方法

task.get(2500, TimeUnit.MILLISECONDS); 

加個參數表示超時時間。



作者:lucode
鏈接:https://www.jianshu.com/p/326465500d1c
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。

 

public class CallableDemo {

    public static String fun() {
        // 成員內部類
        class CallableThread implements Callable<String> {
            @Override
            public String call() {
                try {
                    // 假設這個是一個耗時的網絡 請求
                    Thread.sleep(6000);
                    return "請求返回值";
                } catch (InterruptedException e) {
                    // 假裝記錄一下日志 
                    return null;
                }
            }
        }
        // 開始事件
        long beginTime = System.currentTimeMillis();
        Callable<String> callableThread=new CallableThread();
        FutureTask<String> task= new FutureTask<>(callableThread);
        // 開啟線程
        new Thread(task).start();
        String result;
        try {
            // 如果2.5秒沒有返回值就 拋出異常
            result = task.get(2500, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            result=null;
        }
        // 結束事件
        long endTime = System.currentTimeMillis();
        System.out.println("cast : " + (endTime - beginTime) / 1000 + " second!");
        
        if (result!=null){
            return result;
        }else {
            return null;
        }
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(fun());
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM