Объект запроса был переработан и больше не связан с этим фасадом.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Объект запроса был переработан и больше не связан с этим фасадом.

Сообщение Anonymous »

У меня есть собственный фильтр с BlockingQueue requestQueue в моем приложении Spring.
Когда лимит 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»