Как добраться, в спящем режиме сессия в Быть в спящем режиме Перехватчике?

Похоже, Reloader это то, что вы ищете. Он будет следить за configmap / secret и обновлять связанное с ним развертывание.

6
задан Sathish 8 January 2009 в 17:29
поделиться

4 ответа

Вы можете, но я использовал бы простой POJO только для хранения вещей чисто разделенными. Следует иметь в виду, что значение, сохраненное в одиночном элементе, только будет доступно тем же потоком, который обработал запрос сервлета, поэтому если Вы сделаете кого-либо асинхронного, то необходимо будет объяснить это. Вот супер основной impl:

public class OrgId {
   public static ThreadLocal<Integer> orgId = new ThreadLocal<Integer>();
}

Так как Организационный идентификатор является резидентным объектом на сессии, Вы могли установить значение ThreadLocal в раннем фильтре сервлета как это (не много проверки ошибок):

public class OrgIdFilter implements Filter {
   public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws java.io.IOException, javax.servlet.ServletException {
      int orgId = 0;
      HttpServletRequest req = (HttpServletRequest) servletRequest;
      HttpSession session = req.getSession();
      orgId = Integer.parseInt(session.getAttribute("OrganizationalIdAttr"));
      try {
         OrgId.orgId.set(orgId);
         filterChain.doFilter(servletRequest, servletresponse);
      } finally {
         OrgId.orgId.set(null); // Important to clear after request !!
      }
   }
}

Это предполагает, что orgId находится на сессии, когда фильтр называют, но в противном случае Вы получаете идею....

Затем в Вашем перехватчике (или в значительной степени где угодно) можно получить текущий orgId потока с:

OrgId.orgId.get();   // Might be null.....

Потенциальная путаница здесь - то, что все эти компоненты (фильтр, OrgId и перехватчик) должны быть загружены тем же загрузчиком класса, чтобы гарантировать, что класс OrgId является эффективно одиночным элементом, иначе, с несколькими экземплярами ThreadLocal, бродящего вокруг него, не будет последовательно работать, или вообще. Само собой разумеется, все это должно происходить в том же VM.

Я не уверен - ли это самый чистый способ решить эту проблему, но это действительно получает Вас Ваш orgId, где Вам нужен он.

2
ответ дан 17 December 2019 в 02:34
поделиться

При создании Перехватчика если можно предоставить ему ссылку на SessionFactory, можно использовать SessionFactory#getCurrentSession

2
ответ дан 17 December 2019 в 02:34
поделиться

Перехватчик может быть сделан BeanFactoryAware, и SessionFactory может быть получен с помощью бобовой фабрики, из которой может быть получена текущая сессия.

Так как это походило на плохой дизайн из-за круговой зависимости и создание Перехватчика, знающего о контейнере Spring, я использовал ThreadLocal, как предложил Nicholas

0
ответ дан 17 December 2019 в 02:34
поделиться

Если все, в чем Вы нуждаетесь, является Организационным идентификатором, Вы могли бы поместить его в статический ThreadLocal и затем получить доступ к нему в перехватчике.

С другой стороны, если Вы - тупик при получении сессии, и это зависит от того, какова Ваша среда, Вы могли посадить перехватчик в аварийном режиме и использовать org.hibernate.event.FlushEntityEventListener который, кажется, больше вроде того, в чем Вы нуждаетесь так или иначе. Можно получить сессию как это (грубый псевдо код):

FlushEntityEventListener.onFlushEntity(FlushEntityEvent event)
EntityEvent entityEvent = event.getEntityEntry();
EntityPersister persister = entityEvent.getPersister();
SessionFactoryImplementor sessionFactoryImplor = persister.getFactory();
Session session = sessionFactoryImplor.getCurrentSession();

От Того, чтобы быть в спящем режиме 3 На Документах Строки: система событий может использоваться, кроме того, или в качестве замены для перехватчиков.

2
ответ дан 17 December 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: