* This is potentially more bandwidth intensive than having each workgroup watch
* it's own schedule but uses less threads.</p>
* TODO: trace down all events that cause a state change so we don't have to poll
*/
private void startTimer() {
TaskEngine taskEngine = TaskEngine.getInstance();
taskEngine.schedule(new TimerTask() {
@Override
public void run() {
workgroupLock.readLock().lock();
try {
for (Workgroup group : workgroups.values()) {
Workgroup.Status currentOpen = group.getStatus();
Workgroup.Status oldOpen = workgroupOpenStatus.get(group.getID());
if (oldOpen != currentOpen) {
group.broadcastQueuesStatus();
workgroupOpenStatus.put(group.getID(), currentOpen);
if (Workgroup.Status.OPEN != oldOpen && Workgroup.Status.OPEN == currentOpen) {
// Trigger the event that the workgroup has been opened
group.notifyOpened();
}
else if (Workgroup.Status.OPEN == oldOpen) {
// Trigger the event that the workgroup has been closed
group.notifyClosed();
}
}
}
}
finally {
workgroupLock.readLock().unlock();
}
}
}, 45000, 9000);
// Every 5 minutes let the workgroups clean up dead requests or dead rooms. This may occur
// if the connections were lost or the invitations were lost or whatever
taskEngine.schedule(new TimerTask() {
@Override
public void run() {
workgroupLock.readLock().lock();
try {
for (Workgroup group : workgroups.values()) {
group.cleanup();
}
}
finally {
workgroupLock.readLock().unlock();
}
}
}, 60000, 300000);
// Every 15 seconds check for not answered room invitations
taskEngine.schedule(new TimerTask() {
@Override
public void run() {
workgroupLock.readLock().lock();
try {
for (Workgroup group : workgroups.values()) {
group.checkRequests();
}
}
finally {
workgroupLock.readLock().unlock();
}
}
}, 10000, 15000);
// Every 30 seconds check if the search index of the workgroups should be updated
taskEngine.schedule(new TimerTask() {
@Override
public void run() {
workgroupLock.readLock().lock();
try {
for (Workgroup group : workgroups.values()) {