use of io.github.resilience4j.circuitbreaker.CallNotPermittedException in project java-chassis by ServiceComb.
the class ProviderGovernanceHandler method handle.
@Override
public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {
Supplier<CompletionStage<Response>> next = createBusinessCompletionStageSupplier(invocation);
DecorateCompletionStage<Response> dcs = Decorators.ofCompletionStage(next);
GovernanceRequest request = MatchType.createGovHttpRequest(invocation);
try {
ServiceCombInvocationContext.setInvocationContext(invocation);
addRateLimiting(dcs, request);
addCircuitBreaker(dcs, request);
addBulkhead(dcs, request);
} finally {
ServiceCombInvocationContext.removeInvocationContext();
}
dcs.get().whenComplete((r, e) -> {
if (e == null) {
asyncResp.complete(r);
return;
}
if (e instanceof RequestNotPermitted) {
asyncResp.complete(Response.failResp(new InvocationException(429, "rate limited.", new CommonExceptionData("rate limited."))));
LOGGER.warn("the request is rate limit by policy : {}", e.getMessage());
} else if (e instanceof CallNotPermittedException) {
asyncResp.complete(Response.failResp(new InvocationException(429, "circuitBreaker is open.", new CommonExceptionData("circuitBreaker is open."))));
LOGGER.warn("circuitBreaker is open by policy : {}", e.getMessage());
} else if (e instanceof BulkheadFullException) {
asyncResp.complete(Response.failResp(new InvocationException(429, "bulkhead is full and does not permit further calls.", new CommonExceptionData("bulkhead is full and does not permit further calls."))));
LOGGER.warn("bulkhead is full and does not permit further calls by policy : {}", e.getMessage());
} else {
asyncResp.complete(Response.createProducerFail(e));
}
});
}
use of io.github.resilience4j.circuitbreaker.CallNotPermittedException in project incubator-servicecomb-java-chassis by apache.
the class ProviderGovernanceHandler method handle.
@Override
public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {
Supplier<CompletionStage<Response>> next = createBusinessCompletionStageSupplier(invocation);
DecorateCompletionStage<Response> dcs = Decorators.ofCompletionStage(next);
GovernanceRequest request = MatchType.createGovHttpRequest(invocation);
try {
ServiceCombInvocationContext.setInvocationContext(invocation);
addRateLimiting(dcs, request);
addCircuitBreaker(dcs, request);
addBulkhead(dcs, request);
} finally {
ServiceCombInvocationContext.removeInvocationContext();
}
dcs.get().whenComplete((r, e) -> {
if (e == null) {
asyncResp.complete(r);
return;
}
if (e instanceof RequestNotPermitted) {
asyncResp.complete(Response.failResp(new InvocationException(429, "rate limited.", new CommonExceptionData("rate limited."))));
LOGGER.warn("the request is rate limit by policy : {}", e.getMessage());
} else if (e instanceof CallNotPermittedException) {
asyncResp.complete(Response.failResp(new InvocationException(429, "circuitBreaker is open.", new CommonExceptionData("circuitBreaker is open."))));
LOGGER.warn("circuitBreaker is open by policy : {}", e.getMessage());
} else if (e instanceof BulkheadFullException) {
asyncResp.complete(Response.failResp(new InvocationException(429, "bulkhead is full and does not permit further calls.", new CommonExceptionData("bulkhead is full and does not permit further calls."))));
LOGGER.warn("bulkhead is full and does not permit further calls by policy : {}", e.getMessage());
} else {
asyncResp.complete(Response.createProducerFail(e));
}
});
}
Aggregations