2016-02-08 3 views
0

В настоящее время мы интегрируем 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?

ответ

0

Вы правы, вот как это реализовано прямо сейчас, и единственным обходным путем является явное обращение setAttribute() к каждому обновлению. Я думаю, что это можно улучшить и создать билет Apache Ignite: https://issues.apache.org/jira/browse/IGNITE-2594

+0

Оке, интересно узнать! Прямо сейчас я переопределил 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

+0

@NickGreen Конечно, вы можете добавить себя к наблюдателям билетов и отслеживать прогресс. –

+0

@NickGreen проблема исправлена. Исправление будет доступно в одном из ближайших выпусков. Пока вы можете построить Apache Ignite из источников и использовать исправление на вашей стороне. – dmagda

Смежные вопросы