@Test public void testSingleValueCheckThreadCountWithExceptionItems() { final String resourceName = "testSingleValueCheckThreadCountWithExceptionItems"; final ResourceWrapper resourceWrapper = new StringResourceWrapper(resourceName, EntryType.IN); int paramIdx = 0; long globalThreshold = 5L; int thresholdB = 3; int thresholdD = 7; ParamFlowRule rule = new ParamFlowRule(resourceName).setCount(globalThreshold).setParamIdx(paramIdx) .setGrade(RuleConstant.FLOW_GRADE_THREAD); String valueA = "valueA"; String valueB = "valueB"; String valueC = "valueC"; String valueD = "valueD"; Map<Object, Integer> map = new HashMap<Object, Integer>(); map.put(valueB, thresholdB); map.put(valueD, thresholdD); rule.setParsedHotItems(map); ParameterMetric metric = mock(ParameterMetric.class); when(metric.getThreadCount(paramIdx, valueA)).thenReturn(globalThreshold - 1); when(metric.getThreadCount(paramIdx, valueB)).thenReturn(globalThreshold - 1); when(metric.getThreadCount(paramIdx, valueC)).thenReturn(globalThreshold - 1); when(metric.getThreadCount(paramIdx, valueD)).thenReturn(globalThreshold + 1); ParameterMetricStorage.getMetricsMap().put(resourceWrapper.getName(), metric); assertTrue(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueA)); assertFalse(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueB)); assertTrue(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueC)); assertTrue(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueD)); when(metric.getThreadCount(paramIdx, valueA)).thenReturn(globalThreshold); when(metric.getThreadCount(paramIdx, valueB)).thenReturn(thresholdB - 1L); when(metric.getThreadCount(paramIdx, valueC)).thenReturn(globalThreshold + 1); when(metric.getThreadCount(paramIdx, valueD)).thenReturn(globalThreshold - 1).thenReturn((long)thresholdD); assertFalse(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueA)); assertTrue(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueB)); assertFalse(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueC)); assertTrue(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueD)); assertFalse(ParamFlowChecker.passSingleValueCheck(resourceWrapper, rule, 1, valueD)); }
static boolean passSingleValueCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int acquireCount, Object value) { if (rule.getGrade() == RuleConstant.FLOW_GRADE_QPS) { if (rule.getControlBehavior() == RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER) { return passThrottleLocalCheck(resourceWrapper, rule, acquireCount, value); } else { return passDefaultLocalCheck(resourceWrapper, rule, acquireCount, value); } } else if (rule.getGrade() == RuleConstant.FLOW_GRADE_THREAD) { Set<Object> exclusionItems = rule.getParsedHotItems().keySet(); long threadCount = getParameterMetric(resourceWrapper).getThreadCount(rule.getParamIdx(), value); if (exclusionItems.contains(value)) { int itemThreshold = rule.getParsedHotItems().get(value); return ++threadCount <= itemThreshold; } long threshold = (long)rule.getCount(); return ++threadCount <= threshold; } return true; }
ParamFlowChecker { static boolean passSingleValueCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int acquireCount, Object value) { if (rule.getGrade() == RuleConstant.FLOW_GRADE_QPS) { if (rule.getControlBehavior() == RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER) { return passThrottleLocalCheck(resourceWrapper, rule, acquireCount, value); } else { return passDefaultLocalCheck(resourceWrapper, rule, acquireCount, value); } } else if (rule.getGrade() == RuleConstant.FLOW_GRADE_THREAD) { Set<Object> exclusionItems = rule.getParsedHotItems().keySet(); long threadCount = getParameterMetric(resourceWrapper).getThreadCount(rule.getParamIdx(), value); if (exclusionItems.contains(value)) { int itemThreshold = rule.getParsedHotItems().get(value); return ++threadCount <= itemThreshold; } long threshold = (long)rule.getCount(); return ++threadCount <= threshold; } return true; } }
ParamFlowChecker { static boolean passSingleValueCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int acquireCount, Object value) { if (rule.getGrade() == RuleConstant.FLOW_GRADE_QPS) { if (rule.getControlBehavior() == RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER) { return passThrottleLocalCheck(resourceWrapper, rule, acquireCount, value); } else { return passDefaultLocalCheck(resourceWrapper, rule, acquireCount, value); } } else if (rule.getGrade() == RuleConstant.FLOW_GRADE_THREAD) { Set<Object> exclusionItems = rule.getParsedHotItems().keySet(); long threadCount = getParameterMetric(resourceWrapper).getThreadCount(rule.getParamIdx(), value); if (exclusionItems.contains(value)) { int itemThreshold = rule.getParsedHotItems().get(value); return ++threadCount <= itemThreshold; } long threshold = (long)rule.getCount(); return ++threadCount <= threshold; } return true; } private  ParamFlowChecker(); }
ParamFlowChecker { static boolean passSingleValueCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int acquireCount, Object value) { if (rule.getGrade() == RuleConstant.FLOW_GRADE_QPS) { if (rule.getControlBehavior() == RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER) { return passThrottleLocalCheck(resourceWrapper, rule, acquireCount, value); } else { return passDefaultLocalCheck(resourceWrapper, rule, acquireCount, value); } } else if (rule.getGrade() == RuleConstant.FLOW_GRADE_THREAD) { Set<Object> exclusionItems = rule.getParsedHotItems().keySet(); long threadCount = getParameterMetric(resourceWrapper).getThreadCount(rule.getParamIdx(), value); if (exclusionItems.contains(value)) { int itemThreshold = rule.getParsedHotItems().get(value); return ++threadCount <= itemThreshold; } long threshold = (long)rule.getCount(); return ++threadCount <= threshold; } return true; } private  ParamFlowChecker(); static boolean passCheck(ResourceWrapper resourceWrapper, /*@Valid*/ ParamFlowRule rule, /*@Valid*/ int count,
                             Object... args); }
ParamFlowChecker { static boolean passSingleValueCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int acquireCount, Object value) { if (rule.getGrade() == RuleConstant.FLOW_GRADE_QPS) { if (rule.getControlBehavior() == RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER) { return passThrottleLocalCheck(resourceWrapper, rule, acquireCount, value); } else { return passDefaultLocalCheck(resourceWrapper, rule, acquireCount, value); } } else if (rule.getGrade() == RuleConstant.FLOW_GRADE_THREAD) { Set<Object> exclusionItems = rule.getParsedHotItems().keySet(); long threadCount = getParameterMetric(resourceWrapper).getThreadCount(rule.getParamIdx(), value); if (exclusionItems.contains(value)) { int itemThreshold = rule.getParsedHotItems().get(value); return ++threadCount <= itemThreshold; } long threshold = (long)rule.getCount(); return ++threadCount <= threshold; } return true; } private  ParamFlowChecker(); static boolean passCheck(ResourceWrapper resourceWrapper, /*@Valid*/ ParamFlowRule rule, /*@Valid*/ int count,
                             Object... args);  }