Я пытаюсь настроить кластер Tomcat на AWS и так AWS не поддерживает IP многоадресной передачи, один из опции tomcat clustering using DBTomcat Hazelcast Session магазин Session Attributes Исчезновение
Это хорошо понимал, однако, из-за потери производительности связанные с вызовами БД, в настоящее время я рассматриваю Hazelcast как хранилище сеансов. Нынешний подход к фильму Hazelcast не подходит для меня, поскольку в веб-приложении есть другие фильтры, и они несколько мешают, и лучший и более чистый подход состоял бы в том, чтобы настроить PersistenceManager с помощью реализации пользовательского хранилища и настроить его на tomcat/конф context.xml, раздел конфигурации приведен ниже:
<Manager className="org.apache.catalina.session.PersistentManager"
distributable="true"
maxActiveSessions="-1"
maxIdleBackup="2"
maxIdleSwap="5"
processingTime="1000"
saveOnRestart="true"
maxInactiveInterval="1200">
<Store className="com.hm.vigil.platform.session.HC_SessionStore"/>
</Manager>
сеансы были сохранены в экземпляре Hazelcast и след от кота ниже:
---------------------------------------------------------------------------------------
HC_SessionStore == Saving Session ID == C19A496F2BB9E6A4A55E70865261FC9F SESSION == StandardSession[
C19A496F2BB9E6A4A55E70865261FC9F]
SESSION ATTRIBUTE :: USER_IDENTIFIER :: 50
SESSION ATTRIBUTE :: APPLICATION_IDENTIFIER :: APPLICATION_1
SESSION ATTRIBUTE :: USER_EMAIL :: [email protected]
SESSION ATTRIBUTE :: USER_ROLES :: [PLATFORM_ADMIN, CLIENT_ADMIN, PEN_TESTER, USER]
SESSION ATTRIBUTE :: CLIENT_IDENTIFIER :: 1
---------------------------------------------------------------------------------------
03-Nov-2015 15:12:02.562 FINE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.ca
talina.session.PersistentManagerBase.processExpires End expire sessions PersistentManager processing
Time 75 expired sessions: 0
03-Nov-2015 15:12:02.563 FINE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.ca
talina.session.PersistentManagerBase.processExpires Start expire sessions PersistentManager at 14465
43722563 sessioncount 0
03-Nov-2015 15:12:02.577 FINE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.ca
talina.session.PersistentManagerBase.processExpires End expire sessions PersistentManager processing
Time 14 expired sessions: 0
выше след, если от " save ', как переопределенная реализацией магазина, код приведен ниже:
@Override
public void save(Session session) throws IOException {
//System.out.println("HC_SessionStore == Saving Session ID == "+session.getId()+" SESSION == "+session);
try{
String sessionId=session.getId();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(session);
oos.close();
byte[] serializedSession=baos.toByteArray();
sessionStore.put(sessionId,serializedSession);
sessionCounter++;
System.out.println("---------------------------------------------------------------------------------------");
System.out.println("HC_SessionStore == Saving Session ID == "+sessionId+" SESSION == "+session);
Enumeration<String> attributeNames=((StandardSession)session).getAttributeNames();
while(attributeNames.hasMoreElements()){
String attributeName=attributeNames.nextElement();
System.out.println("SESSION ATTRIBUTE :: "+attributeName+" :: "+((StandardSession)session).getAttribute(attributeName));
}//while closing
System.out.println("---------------------------------------------------------------------------------------");
}catch(Exception e){throw new IOException(e);}
}//save closing
Где «sessionStore» - это распределенная карта Hazelcast.
Соответствующий метод «нагрузки» из магазина выглядит следующим образом:
@Override
public Session load(String sessionId) throws ClassNotFoundException, IOException {
Session session=null;
try{
byte[] serializedSession=(byte[])sessionStore.get(sessionId);
ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(serializedSession));
//Read the saved session from serialized state
//StandardSession session_=new StandardSession(manager);
StandardSession session_=(StandardSession)ois.readObject();
session_.setManager(manager);
ois.close();
//Initialize the transient properties of the session
ois=new ObjectInputStream(new ByteArrayInputStream(serializedSession));
session_.readObjectData(ois);
session=session_;
ois.close();
System.out.println("===========================================================");
System.out.println("HC_SessionStore == Loading Session ID == "+sessionId+" SESSION == "+session);
Enumeration<String> attributeNames=session_.getAttributeNames();
while(attributeNames.hasMoreElements()){
String attributeName=attributeNames.nextElement();
System.out.println("SESSION ATTRIBUTE :: "+attributeName+" :: "+session_.getAttribute(attributeName));
}//while closing
System.out.println("===========================================================");
}catch(Exception e){throw new IOException(e);}
return session;
}//load closing
Теперь один из самых интригующих является то, что в то время как метод «магазин» вызывается, с интервалом по умолчанию 60 секунд, метод «load» никогда не вызывается с учетом того, что любые атрибуты сеанса, которые были сохранены, теряются через некоторое время, что является самым необычным. Технически любые новые атрибуты сеанса, привязанные к сеансу, будут сохранены в Hazelcast после вызова метода «save», и менеджер настроен на замену каждые 5 секунд.
Однако атрибут сеанса потерян (новый), старые все еще существуют. Но независимо от того, какой метод «нагрузки» не называется (по крайней мере, я не вижу след).
Некоторая помощь в этом будет по достоинству оценена.
странно. из вы бы сделали это, но все же, чтобы подтвердить это - вы положили некоторые заявления печати/отладки, чтобы увидеть, если load() когда-либо попал? – Dinesh
Да, есть инструкции печати, в 'load', как в save, см. Приведенный выше код, он также печатает атрибуты, связанные с сеансом, спасибо – Ironluca
Я видел код. Я специально указывал на отладочные заявления сразу после load() (чего я не вижу здесь). Поскольку readObject является блокирующим вызовом. – Dinesh