Похоже, Reloader это то, что вы ищете. Он будет следить за configmap / secret и обновлять связанное с ним развертывание.
Вы можете, но я использовал бы простой 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, где Вам нужен он.
При создании Перехватчика если можно предоставить ему ссылку на SessionFactory, можно использовать SessionFactory#getCurrentSession
Перехватчик может быть сделан BeanFactoryAware, и SessionFactory может быть получен с помощью бобовой фабрики, из которой может быть получена текущая сессия.
Так как это походило на плохой дизайн из-за круговой зависимости и создание Перехватчика, знающего о контейнере Spring, я использовал ThreadLocal, как предложил Nicholas
Если все, в чем Вы нуждаетесь, является Организационным идентификатором, Вы могли бы поместить его в статический 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 На Документах Строки: система событий может использоваться, кроме того, или в качестве замены для перехватчиков.