Объединить асинхронный Resteasy не удалось внедрить бин SessionScoped и RequestScoped с CDI - PullRequest
0 голосов
/ 13 марта 2012

Я работаю над проблемой, связанной с асинхронным заданием в Reasteasy (http://docs.jboss.org/resteasy/docs/2.3.1.GA/userguide/html_single/index.html#async_job_service).

Я отправляю запрос с добавлением? Asynch = true к URL, и затем задание запускается асинхронно, но когда оно выполняется, оно работаетнормально с аннотированным бином @ApplicationScoped или @Singleton, но он не может получить доступ к бину класса, объявленному с аннотацией @RequestScoped, и я всегда сталкиваюсь с этой ошибкой:

org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped
    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:664)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:77)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:87)
    at com.examplecompany.exampleproject.multitenancy.org$jboss$weld$bean-flat-ManagedBean-class_com$examplecompany$exampleproject$multitenancy$PersistenceContext_$$WeldClientProxy.setDb(org$jboss$weld$bean-flat-ManagedBean-class_com$examplecompany$exampleproject$multitenancy$PersistenceContext$$_WeldClientProxy.java)
    at com.examplecompany.exampleproject.auth.oauth.secure.OAuthDelegate.filterHttp(OAuthDelegate.java:115)
    at com.examplecompany.exampleproject.auth.oauth.secure.AuthorizationInterceptor.preProcess(AuthorizationInterceptor.java:59)
    at com.examplecompany.exampleproject.auth.oauth.secure.org$jboss$weld$bean-flat-ManagedBean-com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$@javax$enterprise$context$ApplicationScoped()@javax$ws$rs$ext$Provider()@org$jboss$resteasy$annotations$interception$SecurityPrecedence()@org$jboss$resteasy$annotations$interception$ServerInterceptor()${com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$oauthDelegate$@javax$inject$Inject()$$}_$$_WeldClientProxy.preProcess(org$jboss$weld$bean-flat-ManagedBean-com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$@javax$enterprise$context$ApplicationScoped()@javax$ws$rs$ext$Provider()@org$jboss$resteasy$annotations$interception$SecurityPrecedence()@org$jboss$resteasy$annotations$interception$ServerInterceptor()${com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$oauthDelegate$@javax$inject$Inject()$$}_$$_WeldClientProxy.java)
    at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:247)
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222)
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211)
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:502)
    at org.jboss.resteasy.core.AsynchronousDispatcher.invokeSuper(AsynchronousDispatcher.java:227)
    at org.jboss.resteasy.core.AsynchronousDispatcher$1.call(AsynchronousDispatcher.java:267)
    at org.jboss.resteasy.core.AsynchronousDispatcher$1.call(AsynchronousDispatcher.java:259)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

Эта ошибка не возникает, если я отправляю один и тот же запросне добавляя? asynch = true.

Я дополнительно исследовал проблему и написал следующие строки в своем коде

try {
    Context context = beanManager.getContext(RequestScoped.class);
} catch (ContextNotActiveException e) {
    logger.info("Oops the context does not exists, we are in bad sh*t",e);
}

Если я в асинхронном режиме, ContextNotActiveException всегда выбрасываетсяи журнал имеет одно и то же сообщение об исключении WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped.

Так что я предполагаю, что когда задача запускается в асинхронном режиме, два контекста Session и Request не создаются, и, таким образом, мой компонент, определенный в этих областях,недоступен.

Я поднял билет в Resteasy Jira для этого: https://issues.jboss.org/browse/RESTEASY-682

1 Ответ

0 голосов
/ 14 марта 2012

Согласно спецификации, раздел 6.7.2, SessionScope недоступен для запросов веб-служб.Вам нужно будет создать новую постоянную область и использовать ее.Проблема с вызовами веб-службы (JAXRS или JAXWS) и сеансом заключается в том, что не существует гарантированного способа отслеживания сеанса от одного запроса к другому.Клиенты не обязаны отправлять файлы cookie или использовать параметры запроса.Если ваша служба требует и обеспечивает это, вам придется либо создать новую область и контекстную поддержку, либо использовать API реализации CDI, чтобы вручную запустить и привязать к области сеанса.

...