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 {
}
String type = rootNode.attributeValue("type");
int pauseDuration = getIntAttribue(rootNode.attributeValue("pause"), -1);
if ("terminate".equals(type)) {
session.close();
respond(response, createEmptyBody(), request.getMethod());
}
else if (pauseDuration > 0 && pauseDuration <= session.getMaxPause()) {
session.pause(pauseDuration);
respond(response, createEmptyBody(), request.getMethod());
}
else {
session.resetInactivityTimeout();
connection.setContinuation(ContinuationSupport.getContinuation(request, connection));
request.setAttribute("request-session", connection.getSession());
request.setAttribute("request", connection.getRequestId());
......@@ -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() {
// Reader is associated with a new XMPPPacketReader
XMPPPacketReader reader = localReader.get();
......
......@@ -86,6 +86,7 @@ public class HttpSession extends LocalClientSession {
private Set<SessionListener> listeners = new CopyOnWriteArraySet<SessionListener>();
private volatile boolean isClosed;
private int inactivityTimeout;
private int defaultInactivityTimeout;
private long lastActivity;
private long lastRequestID;
private int maxRequests;
......@@ -352,6 +353,18 @@ public class HttpSession extends LocalClientSession {
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
* terminated.
......@@ -363,6 +376,16 @@ public class HttpSession extends LocalClientSession {
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
* terminated.
......@@ -374,6 +397,28 @@ public class HttpSession extends LocalClientSession {
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
* is a request was either made or responded to. If the session is currently active, meaning
......
......@@ -134,11 +134,12 @@ public class HttpSessionManager {
session.setMaxPause(getMaxPause());
if(session.isPollingSession()) {
session.setInactivityTimeout(getPollingInactivityTimeout());
session.setDefaultInactivityTimeout(getPollingInactivityTimeout());
}
else {
session.setInactivityTimeout(getInactivityTimeout());
session.setDefaultInactivityTimeout(getInactivityTimeout());
}
session.resetInactivityTimeout();
// Store language and version information in the connection.
session.setLanguage(language);
......@@ -319,11 +320,11 @@ public class HttpSessionManager {
response.addAttribute("inactivity", String.valueOf(session.getInactivityTimeout()));
response.addAttribute("polling", String.valueOf(session.getMaxPollingInterval()));
response.addAttribute("wait", String.valueOf(session.getWait()));
response.addAttribute("maxpause", String.valueOf(session.getMaxPause()));
if ((session.getMajorVersion() == 1 && session.getMinorVersion() >= 6) ||
session.getMajorVersion() > 1) {
response.addAttribute("hold", String.valueOf(session.getHold()));
response.addAttribute("ack", String.valueOf(session.getLastAcknowledged()));
response.addAttribute("maxpause", String.valueOf(session.getMaxPause()));
response.addAttribute("ver", String.valueOf(session.getMajorVersion())
+ "." + String.valueOf(session.getMinorVersion()));
}
......@@ -341,8 +342,8 @@ public class HttpSessionManager {
public void run() {
long currentTime = System.currentTimeMillis();
for (HttpSession session : sessionMap.values()) {
long lastActive = (currentTime - session.getLastActivity()) / 1000;
if (lastActive > session.getInactivityTimeout()) {
long lastActive = currentTime - session.getLastActivity();
if (lastActive > session.getInactivityTimeout() * JiveConstants.SECOND) {
session.close();
}
}
......@@ -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.
*/
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