Области применения 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. Объем сессии немного сложнее, вам нужна реальная поддержка сессий в вашем приложении, чтобы иметь возможность ее реализовать.

Другие вопросы по тегам