package com.psddev.cms.rtc; import com.psddev.dari.db.Database; import com.psddev.dari.db.DatabaseException; import com.psddev.dari.db.Query; import com.psddev.dari.util.RepeatingTask; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; public class RtcSessionTask extends RepeatingTask { private static final Logger LOGGER = LoggerFactory.getLogger(RtcSessionTask.class); @Override protected DateTime calculateRunTime(DateTime currentTime) { return everyMinute(currentTime); } @Override protected void doRepeatingTask(DateTime currentTime) { try { RtcSessionTaskStatus status = Query.from(RtcSessionTaskStatus.class).first(); long currentTimeMillis = currentTime.getMillis(); if (status.getLastRun() < currentTimeMillis) { status.getState().replaceAtomically("lastRun", currentTimeMillis); try { status.save(); } catch (DatabaseException error) { return; } } Query<RtcSession> query = Query .from(RtcSession.class) .where("lastPing < ?", Database.Static.getDefault().now() - 60L * 1000L); for (List<RtcSession> sessions; !(sessions = query.select(0, 100).getItems()).isEmpty();) { sessions.forEach(RtcSession::disconnect); } } catch (Throwable error) { LOGGER.debug( String.format("Can't execute [%s]!", this), error); } } }