Когда лимит HTTP-запросов превышен, я помещаю в него запрос и вызываю его, поскольку лимит запросов сбрасывается. Но при выполнении http-запроса возникает исключение. Как я могу это исправить?
Код: Выделить всё
Exception:
Код: Выделить всё
java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.checkFacade(RequestFacade.java:855) ~[tomcat-embed-core-10.1.19.jar:10.1.19]
at org.apache.catalina.connector.RequestFacade.isAsyncSupported(RequestFacade.java:733) ~[tomcat-embed-core-10.1.19.jar:10.1.19]
at jakarta.servlet.ServletRequestWrapper.isAsyncSupported(ServletRequestWrapper.java:378) ~[tomcat-embed-core-10.1.19.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-10.1.19.jar:10.1.19]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.19.jar:10.1.19]
Код: Выделить всё
@Component
@Slf4j
@EnableScheduling
public class ApiRequestFilter implements Filter {
private final AtomicInteger resetCounter = new AtomicInteger(0);
private final int MAX_NUMB_OF_REQUESTS_PER_SECOND = 2;
private final BlockingQueue requestQueue = new LinkedBlockingQueue();
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
if (servletRequest instanceof HttpServletRequest httpServletRequest){
resetCounter.getAndIncrement();
String uri = httpServletRequest.getRequestURI();
log.warn("Incoming request: {}, request counter in the present: {}", uri, resetCounter.get());
if(resetCounter.get() > MAX_NUMB_OF_REQUESTS_PER_SECOND){
try {
requestQueue.put(() -> {
try {
filterChain.doFilter(servletRequest, servletResponse);
} catch (IOException | ServletException e) {
log.error("Error when executing a request from the queue", e);
}
});
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else{
filterChain.doFilter(servletRequest, servletResponse);
}
} else {
((HttpServletResponse) servletResponse).sendError(400, "Bad Request");
}
}
@Scheduled(timeUnit = TimeUnit.SECONDS, fixedDelay = 1, initialDelay = 0)
private void resetRequestCounter(){
if (resetCounter.get() > 0) resetCounter.set(0);
while (!requestQueue.isEmpty()) {
try {
requestQueue.take().run();
} catch (InterruptedException e) {
log.error("Error when executing a request from the queue", e);
}
}
}
}

Подробнее здесь: https://stackoverflow.com/questions/783 ... this-facad