Области применения CDI в не http-приложении
Я разрабатываю приложение Java EE без http-интерфейса: оно использует только MQTT для отправки / получения данных.
Мне интересно, есть ли CDI @SessionScoped
а также @RequestScoped
примените к этому сценарию, или я должен определить пользовательские области для обработки запросов клиента.
редактировать
Я попробовал простое приложение, которое вводит @SessionScoped
или же @RequestScoped
bean в mqtt получает обратный вызов, и я получил исключение, сообщающее, что у меня нет активного контекста.
Можно ли программно активировать контекст, чтобы жизненный цикл бинов соответствовал выбранной области действия?
PS: когда я отправлял вопрос, мне было не лень делать этот простой тест, но я был смел, чтобы углубиться в теорию объема CDI... и все же я..
1 ответ
Существует возможность, что вам нужно создать контекст запроса или сеанса самостоятельно.
Это, конечно, реализация 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. Объем сессии немного сложнее, вам нужна реальная поддержка сессий в вашем приложении, чтобы иметь возможность ее реализовать.