В настоящее время мы интегрируем Apache Ignite в наше приложение для совместного использования сеансов в кластере. См. Ignite docs. На этом этапе мы можем успешно обмениваться сеансами между двумя локальными экземплярами tomcat, но есть один прецедент, который (кажется) не поддерживается Ignite.Обновление атрибутов Apache Ignite WebSession
В нашем приложении у нас есть объект сеанса, который называется «Профиль». Этот профиль является специфичным для пользователя, и все атрибуты добавляются к этому объекту, пока пользователь просматривает приложение.
Мы обновляем 'Профиль' объект следующим образом (псевдо-код):
profile = request.getSession().getProfile(); //Get Profile object from session
profile.setLastVisitedPage("test");
Без Apache Ignite, наша сессия будет содержать правильное значение 'setLastVisitedPage' ('Test'). Но при использовании Ignite объект Ignite «WebSession» выглядит несколько по-другому: при установке значения «setLastVisitedPage» в объекте сеанса WebSession сначала корректно будет содержать правильное значение («test»), но при просмотре на следующая страница, объект WebSession, который разрешен из кеша Ignite, не содержит измененного атрибута setLastVisitedPage.
Я взглянул на код Ignite, и я думаю, я знаю, почему это работает не так, как ожидалось. Глядя на «WebSession» в воспламенить класс, я вижу следующий метод:
public void setAttribute(String name, Object val) {
attrs.put(name, val);
if (updates != null)
updates.add(new T2<>(name, val));
}
Короче говоря: Ignite ожидает, что после каждого обновления к объекту сеанса, вызывается метод session.setAttribute, так Ignite добавит изменения к его внутренней коллекции «обновлений», которая используется для обновления объекта в сетке Ignite. Решением для нашего приложения было бы изменение кода наших приложений, чтобы вызвать setAttribute после каждого обновления, но мы также используем зависимостей кода, которые мы не можем изменить и не можем вызвать setAttribute после изменения объекта сеанса.
Is есть причина, по которой Ignite требует вызвать setAttribute после изменения объекта сеанса, или это ошибка в Ignite?
Оке, интересно узнать! Прямо сейчас я переопределил WebSessionFilter своей собственной версией и добавил следующий код (который, кажется, работает): 'Enumeration names = ses.getAttributeNames(); while (names.hasMoreElements()) { \t String name = names.nextElement(); \t ses.setAttribute (имя, ses.getAttribute (имя)); } '}' } Я добавил этот код непосредственно перед сборкой обновлений: 'Collection > updates = ((WebSession) ses) .updates();' Не могли бы вы прокомментировать это ответ, когда проблема Ignite Jira решена? –
NickGreen
@NickGreen Конечно, вы можете добавить себя к наблюдателям билетов и отслеживать прогресс. –
@NickGreen проблема исправлена. Исправление будет доступно в одном из ближайших выпусков. Пока вы можете построить Apache Ignite из источников и использовать исправление на вашей стороне. – dmagda