2016-06-13 2 views
5

Я разрабатываю приложение Java EE без http-интерфейса: он использует только MQTT для отправки/получения данных.Области CDI в приложении не http

Мне интересно, применимы ли к этому сценарию CDI @SessionScoped и @RequestScoped, или я должен определить собственные области для обработки запросов клиента.

Редактировать

Я попробовал простое приложение, которое впрыскивает @SessionScoped или @RequestScoped фасоль в MQTT получить обратный вызов, и я получил исключение сказать, что у меня нет никакого активного контекста.

Возможно ли активировать контекст программно, чтобы жизненный цикл beans выполнялся по выбранной области?

PS: когда я отправляю вопрос, который я не был слишком ленив, чтобы сделать этот простой тест, но я был Любопытным идти глубже в теории области видимости КДИ ... и до сих пор я ..

ответ

2

Существует возможность вы необходимо создать запрос или сеанс контекста себя.

Это, конечно, реализация CDI и применение конкретных.

Например, если вы используете Weld и нуждаетесь в области запроса, вы можете создать и активировать org.jboss.weld.context.bound.BoundRequestContext.

 /* Inject the BoundRequestContext. */ 

    /* Alternatively, you could look this up from the BeanManager */ 

    @Inject BoundRequestContext requestContext; 


    ... 


    /* Start the request, providing a data store which will last the lifetime of the request */ 

    public void startRequest(Map<String, Object> requestDataStore) { 

     // Associate the store with the context and activate the context 

     requestContext.associate(requestDataStore); 

     requestContext.activate(); 

    } 


    /* End the request, providing the same data store as was used to start the request */ 

    public void endRequest(Map<String, Object> requestDataStore) { 

     try { 

     /* Invalidate the request (all bean instances will be scheduled for destruction) */ 

     requestContext.invalidate(); 

     /* Deactivate the request, causing all bean instances to be destroyed (as the context is invalid) */ 

     requestContext.deactivate(); 

     } finally { 

     /* Ensure that whatever happens we dissociate to prevent any memory leaks */ 

     requestContext.dissociate(requestDataStore); 

     } 

    } 

вы можете нашли информацию, и этот пример здесь https://docs.jboss.org/weld/reference/latest/en-US/html/contexts.html

Также для BoundConversationContext. Сфера действия сеанса немного сложнее, вам нужна реальная поддержка сеанса в вашем приложении, чтобы иметь возможность ее реализовать.

+0

благодарит за ваш ответ! Я прочитал документацию, которую вы связали, и я нашел полезную информацию. К сожалению, я еще не понял, как я должен использовать «BoundConversationContext»: должен ли я вставлять контекст в bean-компонент, я хочу иметь область запроса и «скопировать-вставить» код, который вы опубликовали? следует ли мне вызвать эти методы из моего кода или использовать контейнер? должен ли я управлять 'requestDataStore'? –

+0

Вам необходимо связать и активировать контекст контекста, прежде чем вы сможете получить доступ к вашему облаковому компоненту и деактивировать его послесловие. Это означает, что вам нужно сделать это за пределами вашего фасоли. В вашем случае вы можете, например, создать контекст беседы, если какой-то четный или полученный данные и деактивировать его после таймаута. – temaleva

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