| Method from org.apache.catalina.valves.CometConnectionManagerValve Detail: |
public void addLifecycleListener(LifecycleListener listener) {
// ------------------------------------------------------------- Properties
// ------------------------------------------------------ Lifecycle Methods
lifecycle.addLifecycleListener(listener);
}
Add a lifecycle event listener to this component. |
public void event(Request request,
Response response,
CometEvent event) throws IOException, ServletException {
// Perform the request
boolean ok = false;
try {
getNext().event(request, response, event);
ok = true;
} finally {
if (!ok || response.isClosed()
|| (event.getEventType() == CometEvent.EventType.END)
|| (event.getEventType() == CometEvent.EventType.ERROR
&& !(event.getEventSubType() == CometEvent.EventSubType.TIMEOUT))) {
// Remove from tracked list, the connection is done
HttpSession session = request.getSession(true);
synchronized (session) {
ConnectionInfo[] connectionInfos = connections.get(session.getId());
if (connectionInfos != null) {
boolean found = false;
for (int i = 0; !found && (i < connectionInfos.length); i++) {
found = (connectionInfos[i].request == request);
}
if (found) {
ConnectionInfo[] newConnectionInfos =
new ConnectionInfo[connectionInfos.length - 1];
int pos = 0;
for (int i = 0; i < connectionInfos.length; i++) {
if (connectionInfos[i].request != request) {
newConnectionInfos[pos++] = connectionInfos[i];
}
}
connections.put(session.getId(), newConnectionInfos);
}
}
}
}
}
}
Use events to update the connection state. |
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
}
Get the lifecycle listeners associated with this lifecycle. If this
Lifecycle has no listeners registered, a zero-length array is returned. |
public String getInfo() {
return (info);
}
Return descriptive information about this Valve implementation. |
public void invoke(Request request,
Response response) throws IOException, ServletException {
// Perform the request
getNext().invoke(request, response);
if (request.isComet() && !response.isClosed()) {
// Start tracking this connection, since this is a
// begin event, and Comet mode is on
HttpSession session = request.getSession(true);
ConnectionInfo newConnectionInfo = new ConnectionInfo();
newConnectionInfo.request = request;
newConnectionInfo.response = response;
newConnectionInfo.event = request.getEvent();
synchronized (session) {
String id = session.getId();
ConnectionInfo[] connectionInfos = connections.get(id);
if (connectionInfos == null) {
connectionInfos = new ConnectionInfo[1];
connectionInfos[0] = newConnectionInfo;
connections.put(id, connectionInfos);
} else {
ConnectionInfo[] newConnectionInfos =
new ConnectionInfo[connectionInfos.length + 1];
for (int i = 0; i < connectionInfos.length; i++) {
newConnectionInfos[i] = connectionInfos[i];
}
newConnectionInfos[connectionInfos.length] = newConnectionInfo;
connections.put(id, newConnectionInfos);
}
}
}
}
Register requests for tracking, whenever needed. |
public void lifecycleEvent(LifecycleEvent event) {
if (event.getType() == Lifecycle.BEFORE_STOP_EVENT) {
// The webapp is getting stopped, so all current connections
// should be closed
// Close all Comet connections associated with this session
Iterator< ConnectionInfo[] > iterator = connections.values().iterator();
while (iterator.hasNext()) {
ConnectionInfo[] connectionInfos = iterator.next();
if (connectionInfos != null) {
for (int i = 0; i < connectionInfos.length; i++) {
ConnectionInfo connectionInfo = connectionInfos[i];
try {
((CometEventImpl) connectionInfo.event).setEventType(CometEvent.EventType.END);
((CometEventImpl) connectionInfo.event).setEventSubType(CometEvent.EventSubType.WEBAPP_RELOAD);
getNext().event(connectionInfo.request, connectionInfo.response, connectionInfo.event);
connectionInfo.event.close();
} catch (Exception e) {
container.getLogger().warn(sm.getString("cometConnectionManagerValve.event"), e);
}
}
}
}
connections.clear();
}
}
|
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
Remove a lifecycle event listener from this component. |
public void sessionCreated(HttpSessionEvent se) {
}
|
public void sessionDestroyed(HttpSessionEvent se) {
// Close all Comet connections associated with this session
ConnectionInfo[] connectionInfos = connections.remove(se.getSession().getId());
if (connectionInfos != null) {
for (int i = 0; i < connectionInfos.length; i++) {
ConnectionInfo connectionInfo = connectionInfos[i];
try {
((CometEventImpl) connectionInfo.event).setEventType(CometEvent.EventType.END);
((CometEventImpl) connectionInfo.event).setEventSubType(CometEvent.EventSubType.SESSION_END);
getNext().event(connectionInfo.request, connectionInfo.response, connectionInfo.event);
connectionInfo.event.close();
} catch (Exception e) {
container.getLogger().warn(sm.getString("cometConnectionManagerValve.event"), e);
}
}
}
}
|
public void start() throws LifecycleException {
// Validate and update our current component state
if (started)
throw new LifecycleException
(sm.getString("semaphoreValve.alreadyStarted"));
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
if (container instanceof Context) {
((Lifecycle) container).addLifecycleListener(this);
}
}
Prepare for the beginning of active use of the public methods of this
component. This method should be called after configure(),
and before any of the public methods of the component are utilized. |
public void stop() throws LifecycleException {
// Validate and update our current component state
if (!started)
throw new LifecycleException
(sm.getString("semaphoreValve.notStarted"));
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
if (container instanceof Context) {
((Lifecycle) container).removeLifecycleListener(this);
}
// The webapp is getting stopped, so all current connections
// should be closed
// Close all Comet connections associated with this session
// Note: this will only be done if the container was not a Context
// (otherwise, this needs to be done before stop, as the servlet would
// be deallocated already)
Iterator< ConnectionInfo[] > iterator = connections.values().iterator();
while (iterator.hasNext()) {
ConnectionInfo[] connectionInfos = iterator.next();
if (connectionInfos != null) {
for (int i = 0; i < connectionInfos.length; i++) {
ConnectionInfo connectionInfo = connectionInfos[i];
try {
connectionInfo.event.close();
} catch (Exception e) {
container.getLogger().warn(sm.getString("cometConnectionManagerValve.event"), e);
}
}
}
}
connections.clear();
}
Gracefully terminate the active use of the public methods of this
component. This method should be the last one called on a given
instance of this component. |