SentinelFallbackHandler.java 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package com.ruoyi.gateway.handler;
  2. import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
  3. import com.alibaba.csp.sentinel.slots.block.BlockException;
  4. import com.ruoyi.common.core.utils.ServletUtils;
  5. import org.springframework.web.reactive.function.server.ServerResponse;
  6. import org.springframework.web.server.ServerWebExchange;
  7. import org.springframework.web.server.WebExceptionHandler;
  8. import reactor.core.publisher.Mono;
  9. /**
  10. * 自定义限流异常处理
  11. *
  12. * @author ruoyi
  13. */
  14. public class SentinelFallbackHandler implements WebExceptionHandler
  15. {
  16. private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange)
  17. {
  18. return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
  19. }
  20. @Override
  21. public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
  22. {
  23. if (exchange.getResponse().isCommitted())
  24. {
  25. return Mono.error(ex);
  26. }
  27. if (!BlockException.isBlockException(ex))
  28. {
  29. return Mono.error(ex);
  30. }
  31. return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
  32. }
  33. private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable)
  34. {
  35. return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
  36. }
  37. }