Commit ac0d0320 authored by huni's avatar huni

Added support for session pauses.

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/branches@10608 b35dd754-fafc-0310-a699-88a17e54d16e
parent 64bc974d
...@@ -238,11 +238,18 @@ public class HttpBindServlet extends HttpServlet { ...@@ -238,11 +238,18 @@ public class HttpBindServlet extends HttpServlet {
} }
String type = rootNode.attributeValue("type"); String type = rootNode.attributeValue("type");
int pauseDuration = getIntAttribue(rootNode.attributeValue("pause"), -1);
if ("terminate".equals(type)) { if ("terminate".equals(type)) {
session.close(); session.close();
respond(response, createEmptyBody(), request.getMethod()); respond(response, createEmptyBody(), request.getMethod());
} }
else if (pauseDuration > 0 && pauseDuration <= session.getMaxPause()) {
session.pause(pauseDuration);
respond(response, createEmptyBody(), request.getMethod());
}
else { else {
session.resetInactivityTimeout();
connection.setContinuation(ContinuationSupport.getContinuation(request, connection)); connection.setContinuation(ContinuationSupport.getContinuation(request, connection));
request.setAttribute("request-session", connection.getSession()); request.setAttribute("request-session", connection.getSession());
request.setAttribute("request", connection.getRequestId()); request.setAttribute("request", connection.getRequestId());
...@@ -341,6 +348,18 @@ public class HttpBindServlet extends HttpServlet { ...@@ -341,6 +348,18 @@ public class HttpBindServlet extends HttpServlet {
} }
} }
private int getIntAttribue(String value, int defaultValue) {
if (value == null || "".equals(value)) {
return defaultValue;
}
try {
return Integer.valueOf(value);
}
catch (Exception ex) {
return defaultValue;
}
}
private XMPPPacketReader getPacketReader() { private XMPPPacketReader getPacketReader() {
// Reader is associated with a new XMPPPacketReader // Reader is associated with a new XMPPPacketReader
XMPPPacketReader reader = localReader.get(); XMPPPacketReader reader = localReader.get();
......
...@@ -86,6 +86,7 @@ public class HttpSession extends LocalClientSession { ...@@ -86,6 +86,7 @@ public class HttpSession extends LocalClientSession {
private Set<SessionListener> listeners = new CopyOnWriteArraySet<SessionListener>(); private Set<SessionListener> listeners = new CopyOnWriteArraySet<SessionListener>();
private volatile boolean isClosed; private volatile boolean isClosed;
private int inactivityTimeout; private int inactivityTimeout;
private int defaultInactivityTimeout;
private long lastActivity; private long lastActivity;
private long lastRequestID; private long lastRequestID;
private int maxRequests; private int maxRequests;
...@@ -352,6 +353,18 @@ public class HttpSession extends LocalClientSession { ...@@ -352,6 +353,18 @@ public class HttpSession extends LocalClientSession {
listeners.remove(listener); listeners.remove(listener);
} }
/**
* Sets the default inactivity timeout of this session. A session's inactivity timeout can
* be temporarily changed using session pause requests.
*
* @see #pause(int)
*
* @param defaultInactivityTimeout the default inactivity timeout of this session.
*/
public void setDefaultInactivityTimeout(int defaultInactivityTimeout) {
this.defaultInactivityTimeout = defaultInactivityTimeout;
}
/** /**
* Sets the time, in seconds, after which this session will be considered inactive and be be * Sets the time, in seconds, after which this session will be considered inactive and be be
* terminated. * terminated.
...@@ -363,6 +376,16 @@ public class HttpSession extends LocalClientSession { ...@@ -363,6 +376,16 @@ public class HttpSession extends LocalClientSession {
this.inactivityTimeout = inactivityTimeout; this.inactivityTimeout = inactivityTimeout;
} }
/**
* Resets the inactivity timeout of this session to default. A session's inactivity timeout can
* be temporarily changed using session pause requests.
*
* @see #pause(int)
*/
public void resetInactivityTimeout() {
this.inactivityTimeout = this.defaultInactivityTimeout;
}
/** /**
* Returns the time, in seconds, after which this session will be considered inactive and * Returns the time, in seconds, after which this session will be considered inactive and
* terminated. * terminated.
...@@ -374,6 +397,28 @@ public class HttpSession extends LocalClientSession { ...@@ -374,6 +397,28 @@ public class HttpSession extends LocalClientSession {
return inactivityTimeout; return inactivityTimeout;
} }
/**
* Pauses the session for the given amount of time. If a client encounters an exceptional
* temporary situation during which it will be unable to send requests to the connection
* manager for a period of time greater than the maximum inactivity period, then the client MAY
* request a temporary increase to the maximum inactivity period by including a 'pause'
* attribute in a request.
*
* @param duration the time, in seconds, after which this session will be considered inactive
* and terminated.
*/
public void pause(int duration) {
// Respond immediately to all pending requests
for (int i = 0; i < connectionQueue.size(); i++) {
HttpConnection toClose = connectionQueue.get(i);
if (!toClose.isClosed()) {
toClose.close();
lastRequestID = toClose.getRequestId();
}
}
setInactivityTimeout(duration);
}
/** /**
* Returns the time in milliseconds since the epoch that this session was last active. Activity * Returns the time in milliseconds since the epoch that this session was last active. Activity
* is a request was either made or responded to. If the session is currently active, meaning * is a request was either made or responded to. If the session is currently active, meaning
......
...@@ -134,11 +134,12 @@ public class HttpSessionManager { ...@@ -134,11 +134,12 @@ public class HttpSessionManager {
session.setMaxPause(getMaxPause()); session.setMaxPause(getMaxPause());
if(session.isPollingSession()) { if(session.isPollingSession()) {
session.setInactivityTimeout(getPollingInactivityTimeout()); session.setDefaultInactivityTimeout(getPollingInactivityTimeout());
} }
else { else {
session.setInactivityTimeout(getInactivityTimeout()); session.setDefaultInactivityTimeout(getInactivityTimeout());
} }
session.resetInactivityTimeout();
// Store language and version information in the connection. // Store language and version information in the connection.
session.setLanguage(language); session.setLanguage(language);
...@@ -319,11 +320,11 @@ public class HttpSessionManager { ...@@ -319,11 +320,11 @@ public class HttpSessionManager {
response.addAttribute("inactivity", String.valueOf(session.getInactivityTimeout())); response.addAttribute("inactivity", String.valueOf(session.getInactivityTimeout()));
response.addAttribute("polling", String.valueOf(session.getMaxPollingInterval())); response.addAttribute("polling", String.valueOf(session.getMaxPollingInterval()));
response.addAttribute("wait", String.valueOf(session.getWait())); response.addAttribute("wait", String.valueOf(session.getWait()));
response.addAttribute("maxpause", String.valueOf(session.getMaxPause()));
if ((session.getMajorVersion() == 1 && session.getMinorVersion() >= 6) || if ((session.getMajorVersion() == 1 && session.getMinorVersion() >= 6) ||
session.getMajorVersion() > 1) { session.getMajorVersion() > 1) {
response.addAttribute("hold", String.valueOf(session.getHold())); response.addAttribute("hold", String.valueOf(session.getHold()));
response.addAttribute("ack", String.valueOf(session.getLastAcknowledged())); response.addAttribute("ack", String.valueOf(session.getLastAcknowledged()));
response.addAttribute("maxpause", String.valueOf(session.getMaxPause()));
response.addAttribute("ver", String.valueOf(session.getMajorVersion()) response.addAttribute("ver", String.valueOf(session.getMajorVersion())
+ "." + String.valueOf(session.getMinorVersion())); + "." + String.valueOf(session.getMinorVersion()));
} }
...@@ -341,8 +342,8 @@ public class HttpSessionManager { ...@@ -341,8 +342,8 @@ public class HttpSessionManager {
public void run() { public void run() {
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
for (HttpSession session : sessionMap.values()) { for (HttpSession session : sessionMap.values()) {
long lastActive = (currentTime - session.getLastActivity()) / 1000; long lastActive = currentTime - session.getLastActivity();
if (lastActive > session.getInactivityTimeout()) { if (lastActive > session.getInactivityTimeout() * JiveConstants.SECOND) {
session.close(); session.close();
} }
} }
...@@ -350,7 +351,7 @@ public class HttpSessionManager { ...@@ -350,7 +351,7 @@ public class HttpSessionManager {
} }
/** /**
* A runner that gurantees that the packets per a session will be sent and * A runner that guarantees that the packets per a session will be sent and
* processed in the order in which they were received. * processed in the order in which they were received.
*/ */
private class HttpPacketSender implements Runnable { private class HttpPacketSender implements Runnable {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment