Исключение IllegalStateException при отправке HttpRequest из метода asyn c - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть сервис, который работает каждый раз, когда в моем приложении заканчивается определенный сеанс, и вызывает 'SessionPublisher' - сервис, который публикует подробности этого сеанса. этот вызов выполняется через AsyncTaskExecutor:

public class SessionCoreStateHandlerAsyncImpl implements SessionCoreStateHandler {
    @Autowired private SessionPublisher sessionPublisher;
    private AsyncTaskExecutor asyncServiceExecutor;

    public SessionCoreStateHandlerAsyncImpl(AsyncTaskExecutor asyncServiceExecutor) {
        this.asyncServiceExecutor = asyncServiceExecutor;
    }

    @Override
    public void endSession(final SessionContext sessionContext) {
        asyncServiceExecutor.execute(() -> {
          sessionPublisher.sendSessionDetails(sessionContext);                      
    }
}

мой сервис SessionPublisher:

public class SessionPublisherImpl implements SessionPublisher {
    @Autowired private OAuth2RestTemplate restTemplate;
    @Value("${rest.url}") private String restUrl;

    @Override
    public NotificationResponse sendSessionDetails(SessionContext sessionContext) {    
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<AtmTransactionNotificationRq> httpEntity = new HttpEntity<>(sessionContext, httpHeaders);

        return restTemplate.postForObject(restUrl, httpEntity, NotificationResponse.class);
    }
}

К сожалению, вызов postForObject вызывает следующее исключение:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.OAuth2RestTemplate': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is 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.
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:362)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:672)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate$$EnhancerBySpringCGLIB$$30788421.postForObject(<generated>)
    at com.poalim.dc.fa.core.base.context.session.SessionPublisherImpl.sendSessionDetailsToCardIssuer(SessionPublisherImpl.java:76)
    at com.poalim.dc.fa.core.base.context.session.SessionCoreStateHandlerAsyncImpl.lambda$endSession$2(SessionCoreStateHandlerAsyncImpl.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: 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.
    at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
    at org.springframework.web.context.request.SessionScope.get(SessionScope.java:55)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:350)
    ... 9 more

Я подозреваю, что, возможно, не весь мой контекст приложения был хорошо перенесен в службу SessionPublisher, так как он работает в отдельном потоке. Мой RestTemplate не нулевой, поэтому в новом потоке должны существовать некоторые конфигурации, но я не могу пропустить это.

есть идеи, пожалуйста?

...