冷饭新炒:理解断路器CircuitBreaker的原理与实现 (5)

编写测试场景类ResourceCircuitBreakerClient:

public class ResourceCircuitBreakerClient { public static void main(String[] args) throws Exception { CircuitBreakerResourceConf conf = new CircuitBreakerResourceConf(); conf.setCoreSize(10); conf.setQueueSize(0); conf.setResourceName("SERVICE"); conf.setTimeout(50); CircuitBreakerResourceManager.X.register(conf); Service service = new Service(); ResourceCircuitBreaker cb = new ResourceCircuitBreaker("SERVICE", 5, 500); for (int i = 0; i < 10; i++) { int temp = i; String result = cb.call(() -> service.process(temp)); System.out.println(String.format("返回结果:%s,number:%d", result, temp)); } Thread.sleep(501L); cb.call(service::processSuccess); for (int i = 0; i < 3; i++) { int temp = i; String result = cb.call(() -> service.process(temp)); System.out.println(String.format("返回结果:%s,number:%d", result, temp)); } } public static class Service { private final Random r = new Random(); public String process(int i) { int sleep = r.nextInt(200); System.out.println(String.format("线程[%s]-进入process方法,number:%d,休眠%d毫秒", Thread.currentThread().getName(), i, sleep)); try { Thread.sleep(sleep); } catch (InterruptedException ignore) { } return String.valueOf(i); } public void processSuccess() { System.out.println(String.format("线程[%s]-调用processSuccess方法", Thread.currentThread().getName())); } } }

某次执行的输出结果如下:

断路器[ResourceCircuitBreaker-SERVICE]重置 线程[SERVICE-CircuitBreakerWorker-0]-进入process方法,number:0,休眠67毫秒 返回结果:null,number:0 线程[SERVICE-CircuitBreakerWorker-1]-进入process方法,number:1,休眠85毫秒 返回结果:null,number:1 线程[SERVICE-CircuitBreakerWorker-2]-进入process方法,number:2,休眠72毫秒 返回结果:null,number:2 线程[SERVICE-CircuitBreakerWorker-3]-进入process方法,number:3,休眠88毫秒 返回结果:null,number:3 线程[SERVICE-CircuitBreakerWorker-4]-进入process方法,number:4,休眠28毫秒 返回结果:4,number:4 线程[SERVICE-CircuitBreakerWorker-5]-进入process方法,number:5,休眠102毫秒 断路器[ResourceCircuitBreaker-SERVICE]状态变更,[CLOSED]->[OPEN] 返回结果:null,number:5 返回结果:null,number:6 返回结果:null,number:7 返回结果:null,number:8 返回结果:null,number:9 断路器[ResourceCircuitBreaker-SERVICE]状态变更,[OPEN]->[HALF_OPEN] 线程[SERVICE-CircuitBreakerWorker-6]-调用processSuccess方法 断路器[ResourceCircuitBreaker-SERVICE]状态变更,[HALF_OPEN]->[CLOSED] 断路器[ResourceCircuitBreaker-SERVICE]重置 线程[SERVICE-CircuitBreakerWorker-7]-进入process方法,number:0,休眠74毫秒 返回结果:null,number:0 线程[SERVICE-CircuitBreakerWorker-8]-进入process方法,number:1,休眠111毫秒 返回结果:null,number:1 线程[SERVICE-CircuitBreakerWorker-9]-进入process方法,number:2,休眠183毫秒 返回结果:null,number:2 滑动窗口和百分比统计

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygpyx.html