2014-09-26 2 views
1

У меня есть веб-приложение, в котором я использую ScheduledThreadPoolExecutor для планирования некоторой логики, которая будет выполнена позже (возможно, после завершения первоначального веб-запроса). Возможно ли получить/использовать HttpServletRequest исходного запроса внутри дочернего потока (созданного посредством вызова «расписание» в ScheduledThreadPoolExecutor)?Доступ к запросу HttpServletRequest в дочерней цепочке

Я попытался автоматическим связывание HttpServletRequest внутри класса, функция работает в детской теме, но получил следующие ошибки (которые я понимаю причину)

java.lang.IllegalStateException: No thread-bound request found: Are 
    you referring to request attributes outside of an actual web request, 
    or processing a request outside of the originally receiving thread? If 
    you are actually operating within a web request and still receive this 
    message, your code is probably running outside of 
    DispatcherServlet/DispatcherPortlet: In this case, use 
    RequestContextListener or RequestContextFilter to expose the current 
    request. 

Есть ли возможный путь? Возможно ли использовать RequestContextFilter?

+3

No. объекта запроса и запроса в области видимости весенние бобы, не должны использоваться после обработки запроса или даже в отдельном потоке. Извлеките данные, необходимые для запланированного задания, затем отправьте задачу, используя эти данные, исполнителю. –

+0

можно использовать [BeanUtils] (http://grepcode.com/file/repo1.maven.org/maven2/commons-beanutils/commons-beanutils/1.8.0/org/apache/commons/beanutils/BeanUtils.java). скопировать объект HttpServletRequest? –

+2

Зачем вам нужен объект HttpServletRequest в запланированном задании? Извлеките данные, необходимые для запланированного задания, на объект и передайте этот объект в задание. –

ответ

0

Похоже, что вы пытаетесь добиться того, чтобы HTTP-соединение сохранялось открытым, в то время как обработка запроса обрабатывается асинхронно в отдельном потоке?

В этом случае вы можете захотеть взглянуть на поддержку DefferedResult в Spring MVC - http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/web/context/request/async/DeferredResult.html - также объясняется здесь - http://java.dzone.com/articles/long-polling-spring-32s

Смежные вопросы