2010-11-19 4 views
2

J'ai du mal à trouver une solution pour ma situation ici. Désolé si cela a déjà été répondu mais je n'ai pas pu trouver celui qui a fonctionné pour moi. Problème: Essayer de tester si une session d'utilisateur a été active pendant plus longtemps que la limite de délai d'attente. J'essaie d'utiliser l'heure de début de la session et l'heure actuelle du système et de les soustraire et si le résultat est supérieur au délai d'attente var-kill la session.Problème arithmétique du calendrier Java

Alors:

for (LogSession logSession : sessionLogList) { 

       Calendar sessionStartTime = logSession.getStartTime(); 
       Calendar currentSysTime = Calendar.getInstance(); 
       currentSysTime.setTime(currentSysTime.getTime()); 
       Calendar activeTime = Calendar.getInstance(); 

       activeTime.setTime(sessionStartTime.getTime()); 
       activeTime.add(activeTime.getTime(), - currentSysTime.getTime()); 

       if (activeTime.getTime() > timeoutLimit) { 
         // Do something 
       } 
} 

Je reçois évidemment un message d'erreur sur la ligne activeTime.add mais je ne suis pas certain de l'approche nécessaire ici. Toute aide serait super merci.

Le délai d'attente est actuellement défini sur 15 minutes, mais il s'agit d'une variable globale pouvant être modifiée.

+0

Quel est le message d'erreur? En outre, je ne vois pas pourquoi l'appel setTime est nécessaire ici: Calendar currentSysTime = Calendar.getInstance(); currentSysTime.setTime (currentSysTime.getTime()); –

Répondre

1

Votre échantillon semble avoir quelques erreurs dans ce mais voici comment je m'y prendrais.

Calendar sessionEndTime = logSession.getStartTime(); 
sessionEndTime.add(Calendar.MINUTE, TIMEOUT_MINS); 
Calendar currentSysTime = Calendar.getInstance(); 
if (currentSysTime.after(sessionEndTime)) { 
//do something 
} 
+0

Merci pour cette approche cerveau mais je reçois une erreur sur l'attribution de sessionEndTime - ne peut pas convertir void en Calendrier. Calendrier sessionStartTime = logSession.getStartTime(); Calendrier currentSysTime = Calendar.getInstance(); Calendrier sessionEndTime = sessionStartTime.add (Calendar.MINUTE, timeout_mins); Des idées? – Frank

+0

Oups! Désolé à ce sujet, pour une raison quelconque, j'ai supposé que le calendrier était immuable. Idiot stupide moi. Je vais éditer mon post pour refléter ce que vous devriez faire! – brain

+0

Merci pour la bonne solution! Meilleure approche suggérée! – Frank

3

Lire l'API, dans la méthode calendar.add il a déclaré que vous avez besoin de préciser à quel champ vous souhaitez ajouter aussi. Exemple

calendar.add(Calendar.HOUR, 24); 

Mais vous ne devez utiliser un peu de manipulation de calendrier.

juste faire une soustractions de curentTimeInMillis en fonction du temps à partir de Millis et si plus (en Millis) alors votre délai d'attente alors vous avez votre réponse

long refTime = System.currentTimeMillis(); 
long now = System.currentTimeMillis(); 
if (now - refTime > TIMEOUT) { 
    ... } 
1
for (LogSession logSession : sessionLogList) { 

       Calendar sessionStartTime = logSession.getStartTime(); 
       Long now = System.currentTimeMillis(); 

       if (now - sessionStartTime.getTimeInMillis() > timeoutLimit) { 
         // Do something 
       } 
} 
0

Si vous comparez l'heure de début de session et l'heure actuelle, le résultat sera que chaque session a un âge maximum et réinitialisera rgardless d'activité.

Vous avez besoin d'un attribut pour la dernière période d'activité de votre objet logSession et l'utiliser pour comparer avec l'heure actuelle. Si ces heures sont long champs simples et affecté le System.currentTimeMilis() vous n'avez pas besoin Calendar arithmétique.

0

Je suppose que vous êtes dans un conteneur web et avez un fichier web.xml disponible. Ne pourriez-vous pas utiliser la norme?

<session-config> 
<session-timeout>30</session-timeout> 
</session-config>