* Extract getRule in BlockException and refine override methods in subclasses Signed-off-by: Eric Zhao <sczyh16@gmail.com>master
@@ -15,8 +15,9 @@ | |||||
*/ | */ | ||||
package com.alibaba.csp.sentinel.slots.block; | package com.alibaba.csp.sentinel.slots.block; | ||||
/*** | |||||
* Abstract exception indicating blocked by Sentinel due to flow control, degraded or system guard. | |||||
/** | |||||
* Abstract exception indicating blocked by Sentinel due to flow control, | |||||
* circuit breaking or system protection triggered. | |||||
* | * | ||||
* @author youji.zj | * @author youji.zj | ||||
*/ | */ | ||||
@@ -42,6 +43,7 @@ public abstract class BlockException extends Exception { | |||||
THROW_OUT_EXCEPTION.setStackTrace(sentinelStackTrace); | THROW_OUT_EXCEPTION.setStackTrace(sentinelStackTrace); | ||||
} | } | ||||
protected AbstractRule rule; | |||||
private String ruleLimitApp; | private String ruleLimitApp; | ||||
public BlockException(String ruleLimitApp) { | public BlockException(String ruleLimitApp) { | ||||
@@ -49,6 +51,12 @@ public abstract class BlockException extends Exception { | |||||
this.ruleLimitApp = ruleLimitApp; | this.ruleLimitApp = ruleLimitApp; | ||||
} | } | ||||
public BlockException(String ruleLimitApp, AbstractRule rule) { | |||||
super(); | |||||
this.ruleLimitApp = ruleLimitApp; | |||||
this.rule = rule; | |||||
} | |||||
public BlockException(String message, Throwable cause) { | public BlockException(String message, Throwable cause) { | ||||
super(message, cause); | super(message, cause); | ||||
} | } | ||||
@@ -58,6 +66,12 @@ public abstract class BlockException extends Exception { | |||||
this.ruleLimitApp = ruleLimitApp; | this.ruleLimitApp = ruleLimitApp; | ||||
} | } | ||||
public BlockException(String ruleLimitApp, String message, AbstractRule rule) { | |||||
super(message); | |||||
this.ruleLimitApp = ruleLimitApp; | |||||
this.rule = rule; | |||||
} | |||||
@Override | @Override | ||||
public Throwable fillInStackTrace() { | public Throwable fillInStackTrace() { | ||||
return this; | return this; | ||||
@@ -98,4 +112,8 @@ public abstract class BlockException extends Exception { | |||||
return false; | return false; | ||||
} | } | ||||
public AbstractRule getRule() { | |||||
return rule; | |||||
} | |||||
} | } |
@@ -17,9 +17,11 @@ package com.alibaba.csp.sentinel.slots.block.authority; | |||||
import com.alibaba.csp.sentinel.slots.block.BlockException; | import com.alibaba.csp.sentinel.slots.block.BlockException; | ||||
/*** | |||||
/** | |||||
* Block exception for request origin access (authority) control. | |||||
* | * | ||||
* @author youji.zj | * @author youji.zj | ||||
* @author Eric Zhao | |||||
*/ | */ | ||||
public class AuthorityException extends BlockException { | public class AuthorityException extends BlockException { | ||||
@@ -27,6 +29,10 @@ public class AuthorityException extends BlockException { | |||||
super(ruleLimitApp); | super(ruleLimitApp); | ||||
} | } | ||||
public AuthorityException(String ruleLimitApp, AuthorityRule rule) { | |||||
super(ruleLimitApp, rule); | |||||
} | |||||
public AuthorityException(String message, Throwable cause) { | public AuthorityException(String message, Throwable cause) { | ||||
super(message, cause); | super(message, cause); | ||||
} | } | ||||
@@ -40,4 +46,15 @@ public class AuthorityException extends BlockException { | |||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* Get triggered rule. | |||||
* Note: the rule result is a reference to rule map and SHOULD NOT be modified. | |||||
* | |||||
* @return triggered rule | |||||
* @since 1.4.2 | |||||
*/ | |||||
@Override | |||||
public AuthorityRule getRule() { | |||||
return rule.as(AuthorityRule.class); | |||||
} | |||||
} | } |
@@ -58,7 +58,7 @@ public class AuthoritySlot extends AbstractLinkedProcessorSlot<DefaultNode> { | |||||
for (AuthorityRule rule : rules) { | for (AuthorityRule rule : rules) { | ||||
if (!AuthorityRuleChecker.passCheck(rule, context)) { | if (!AuthorityRuleChecker.passCheck(rule, context)) { | ||||
throw new AuthorityException(context.getOrigin()); | |||||
throw new AuthorityException(context.getOrigin(), rule); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -26,6 +26,10 @@ public class DegradeException extends BlockException { | |||||
super(ruleLimitApp); | super(ruleLimitApp); | ||||
} | } | ||||
public DegradeException(String ruleLimitApp, DegradeRule rule) { | |||||
super(ruleLimitApp, rule); | |||||
} | |||||
public DegradeException(String message, Throwable cause) { | public DegradeException(String message, Throwable cause) { | ||||
super(message, cause); | super(message, cause); | ||||
} | } | ||||
@@ -38,4 +42,16 @@ public class DegradeException extends BlockException { | |||||
public Throwable fillInStackTrace() { | public Throwable fillInStackTrace() { | ||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* Get triggered rule. | |||||
* Note: the rule result is a reference to rule map and SHOULD NOT be modified. | |||||
* | |||||
* @return triggered rule | |||||
* @since 1.4.2 | |||||
*/ | |||||
@Override | |||||
public DegradeRule getRule() { | |||||
return rule.as(DegradeRule.class); | |||||
} | |||||
} | } |
@@ -76,7 +76,7 @@ public class DegradeRuleManager { | |||||
for (DegradeRule rule : rules) { | for (DegradeRule rule : rules) { | ||||
if (!rule.passCheck(context, node, count)) { | if (!rule.passCheck(context, node, count)) { | ||||
throw new DegradeException(rule.getLimitApp()); | |||||
throw new DegradeException(rule.getLimitApp(), rule); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -23,10 +23,13 @@ import com.alibaba.csp.sentinel.slots.block.BlockException; | |||||
public class FlowException extends BlockException { | public class FlowException extends BlockException { | ||||
public FlowException(String ruleLimitApp) { | public FlowException(String ruleLimitApp) { | ||||
super(ruleLimitApp); | super(ruleLimitApp); | ||||
} | } | ||||
public FlowException(String ruleLimitApp, FlowRule rule) { | |||||
super(ruleLimitApp, rule); | |||||
} | |||||
public FlowException(String message, Throwable cause) { | public FlowException(String message, Throwable cause) { | ||||
super(message, cause); | super(message, cause); | ||||
} | } | ||||
@@ -40,4 +43,15 @@ public class FlowException extends BlockException { | |||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* Get triggered rule. | |||||
* Note: the rule result is a reference to rule map and SHOULD NOT be modified. | |||||
* | |||||
* @return triggered rule | |||||
* @since 1.4.2 | |||||
*/ | |||||
@Override | |||||
public FlowRule getRule() { | |||||
return rule.as(FlowRule.class); | |||||
} | |||||
} | } |
@@ -151,7 +151,7 @@ public class FlowSlot extends AbstractLinkedProcessorSlot<DefaultNode> { | |||||
if (rules != null) { | if (rules != null) { | ||||
for (FlowRule rule : rules) { | for (FlowRule rule : rules) { | ||||
if (!canPassCheck(rule, context, node, count, prioritized)) { | if (!canPassCheck(rule, context, node, count, prioritized)) { | ||||
throw new FlowException(rule.getLimitApp()); | |||||
throw new FlowException(rule.getLimitApp(), rule); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -22,25 +22,34 @@ import com.alibaba.csp.sentinel.slots.block.BlockException; | |||||
*/ | */ | ||||
public class SystemBlockException extends BlockException { | public class SystemBlockException extends BlockException { | ||||
String resourceName; | |||||
public String getResourceName() { | |||||
return resourceName; | |||||
} | |||||
private final String resourceName; | |||||
public SystemBlockException(String resourceName, String message, Throwable cause) { | public SystemBlockException(String resourceName, String message, Throwable cause) { | ||||
super(message, cause); | super(message, cause); | ||||
this.resourceName = resourceName; | this.resourceName = resourceName; | ||||
} | } | ||||
public SystemBlockException(String resourceName, String ruleLimitApp) { | |||||
super(ruleLimitApp); | |||||
public SystemBlockException(String resourceName, String limitType) { | |||||
super(limitType); | |||||
this.resourceName = resourceName; | this.resourceName = resourceName; | ||||
} | } | ||||
public String getResourceName() { | |||||
return resourceName; | |||||
} | |||||
@Override | @Override | ||||
public Throwable fillInStackTrace() { | public Throwable fillInStackTrace() { | ||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* Return the limit type of system rule. | |||||
* | |||||
* @return the limit type | |||||
* @since 1.4.2 | |||||
*/ | |||||
public String getLimitType() { | |||||
return getRuleLimitApp(); | |||||
} | |||||
} | } |
@@ -32,11 +32,17 @@ public class ParamFlowException extends BlockException { | |||||
this.resourceName = resourceName; | this.resourceName = resourceName; | ||||
} | } | ||||
public ParamFlowException(String resourceName, String message) { | |||||
super(message, message); | |||||
public ParamFlowException(String resourceName, String param) { | |||||
super(param, param); | |||||
this.resourceName = resourceName; | this.resourceName = resourceName; | ||||
} | } | ||||
public ParamFlowException(String resourceName, String param, ParamFlowRule rule) { | |||||
super(param, param); | |||||
this.resourceName = resourceName; | |||||
this.rule = rule; | |||||
} | |||||
public String getResourceName() { | public String getResourceName() { | ||||
return resourceName; | return resourceName; | ||||
} | } | ||||
@@ -45,4 +51,26 @@ public class ParamFlowException extends BlockException { | |||||
public Throwable fillInStackTrace() { | public Throwable fillInStackTrace() { | ||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* Get the parameter value that triggered the parameter flow control. | |||||
* | |||||
* @return the parameter value | |||||
* @since 1.4.2 | |||||
*/ | |||||
public String getLimitParam() { | |||||
return getMessage(); | |||||
} | |||||
/** | |||||
* Get triggered rule. | |||||
* Note: the rule result is a reference to rule map and SHOULD NOT be modified. | |||||
* | |||||
* @return triggered rule | |||||
* @since 1.4.2 | |||||
*/ | |||||
@Override | |||||
public ParamFlowRule getRule() { | |||||
return rule.as(ParamFlowRule.class); | |||||
} | |||||
} | } |
@@ -81,12 +81,12 @@ public class ParamFlowSlot extends AbstractLinkedProcessorSlot<DefaultNode> { | |||||
// Here we add the block count. | // Here we add the block count. | ||||
addBlockCount(resourceWrapper, count, args); | addBlockCount(resourceWrapper, count, args); | ||||
String message = ""; | |||||
String triggeredParam = ""; | |||||
if (args.length > rule.getParamIdx()) { | if (args.length > rule.getParamIdx()) { | ||||
Object value = args[rule.getParamIdx()]; | Object value = args[rule.getParamIdx()]; | ||||
message = String.valueOf(value); | |||||
triggeredParam = String.valueOf(value); | |||||
} | } | ||||
throw new ParamFlowException(resourceWrapper.getName(), message); | |||||
throw new ParamFlowException(resourceWrapper.getName(), triggeredParam, rule); | |||||
} | } | ||||
} | } | ||||
} | } | ||||