* @throws IOException - thrown if there is a read/write error
* @throws ServletException - thrown if a servlet error occurs
*/
public void event(final HttpEvent event) throws IOException, ServletException {
final HttpServletRequest request = event.getHttpServletRequest();
final QueueSession session = sessionProvider.getSession(request.getSession(), request.getHeader("RemoteQueueID"));
MessageQueue queue;
switch (event.getType()) {
case BEGIN:
boolean post = "POST".equals(request.getMethod());
queue = getQueue(session, !post);
if (queue == null) {
switch (getConnectionPhase(request)) {
case CONNECTING:
case DISCONNECTING:
return;
}
sendDisconnectWithReason(event.getHttpServletResponse().getOutputStream(),
"There is no queue associated with this session.");
}
synchronized (activeEvents) {
if (post) {
// do not pause incoming messages.
break;
}
else if (queue.messagesWaiting()) {
transmitMessages(event.getHttpServletResponse(), queue);
event.close();
break;
}
if (!queueToSession.containsKey(queue)) {
queueToSession.put(queue, session);
}
Set<HttpEvent> events = activeEvents.get(session);
if (events == null) {
activeEvents.put(session, events = new LinkedHashSet<HttpEvent>());
}
if (events.contains(event)) {
event.close();
}
else {
events.add(event);
}
}
break;
case END:
if ((queue = getQueue(session, false)) != null) {
queue.heartBeat();
}
synchronized (activeEvents) {
Set<HttpEvent> evt = activeEvents.get(session);
if (evt != null) {
evt.remove(event);
}
}
event.close();
break;
case EOF:
event.close();
break;
case TIMEOUT:
case ERROR:
queue = getQueue(session, false);
synchronized (activeEvents) {
Set<HttpEvent> evt = activeEvents.get(session);
if (evt != null) {
evt.remove(event);
}
}
if (event.getType() == HttpEvent.EventType.TIMEOUT) {
if (queue != null) queue.heartBeat();
}
else {
if (queue != null) {
queueToSession.remove(queue);
service.getBus().closeQueue(session.getSessionId());
// session.invalidate();
activeEvents.remove(session);
}
log.error("An Error Occured" + event.getType());
}