package edu.sc.seis.sod;
import java.util.Iterator;
import java.util.TimerTask;
import org.hibernate.Query;
import edu.iris.Fissures.model.MicroSecondDate;
import edu.iris.Fissures.model.TimeInterval;
import edu.iris.Fissures.model.UnitImpl;
import edu.sc.seis.fissuresUtil.chooser.ClockUtil;
import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler;
import edu.sc.seis.sod.hibernate.SodDB;
import edu.sc.seis.sod.hibernate.StatefulEvent;
import edu.sc.seis.sod.hibernate.StatefulEventDB;
/**
* This task runs immediately on instantiation and then once a week after that.
* It removes all events that were failed in the eventArm by a subsetter from
* the database on each run.
*
* @author groves
*
* Created on Dec 28, 2006
*/
public class TotalLoserEventCleaner extends TimerTask {
public TotalLoserEventCleaner(TimeInterval lag) {
this.lagInterval = lag;
// Timer t = new Timer(true);
// t.schedule(this, 0, ONE_WEEK);
}
public void run() {
try {
logger.info("Working");
MicroSecondDate ageAgo = ClockUtil.now().subtract(lagInterval);
// stations will process slightly before channels, so give a little time
// to avoid database forgein key violations
TimeInterval littleSkip = new TimeInterval(10, UnitImpl.MINUTE);
cleanEvents(ageAgo);
StatefulEventDB.getSingleton().commit();
logger.info("Cleaned events");
ageAgo = ageAgo.add(littleSkip);
cleanECP(ageAgo);
SodDB.getSingleton().commit();
logger.info("Cleaned event-channel pairs");
cleanEVP(ageAgo);
SodDB.getSingleton().commit();
logger.info("Cleaned event-vector pairs");
ageAgo = ageAgo.add(littleSkip);
cleanESP(ageAgo);
SodDB.getSingleton().commit();
logger.info("Cleaned event-station pairs");
ageAgo = ageAgo.add(littleSkip);
cleanENP(ageAgo);
SodDB.getSingleton().commit();
logger.info("Cleaned event-network pairs");
} catch(Throwable e) {
try {
StatefulEventDB.getSingleton().rollback();
} catch(Throwable e1) {
GlobalExceptionHandler.handle(e1);
}
GlobalExceptionHandler.handle(e);
}
}
public static void cleanEvents(MicroSecondDate ageAgo) {
Query q = StatefulEventDB.getSingleton().getSession().createQuery(" from "+StatefulEvent.class.getName()+
" e where e.status.standingInt = "+Standing.REJECT.getVal()+
" and e.preferred.originTime.time < :ageAgo");
q.setTimestamp("ageAgo", ageAgo.getTimestamp());
Iterator<StatefulEvent> it = q.iterate();
int counter=0;
while(it.hasNext()) {
StatefulEvent se = it.next();
StatefulEventDB.getSingleton().getSession().delete(se);
counter++;
}
StatefulEventDB.getSingleton().commit();
logger.debug("Done, deleted "+counter+" events.");
}
public static void cleanESP(MicroSecondDate ageAgo) {
clean(EventStationPair.class, ageAgo);
}
public static void cleanENP(MicroSecondDate ageAgo) {
clean(EventNetworkPair.class, ageAgo);
}
public static void cleanECP(MicroSecondDate ageAgo) {
clean(EventChannelPair.class, ageAgo);
}
public static void cleanEVP(MicroSecondDate ageAgo) {
clean(EventVectorPair.class, ageAgo);
}
public static void clean(Class eventPairClass, MicroSecondDate ageAgo) {
Query q = SodDB.getSingleton().getSession().createQuery("delete "+eventPairClass.getName()+
" ep where ep.status.standingInt = "+Standing.REJECT.getVal()+
" and ep.lastQuery < :ageAgo");
q.setTimestamp("ageAgo", ageAgo.getTimestamp());
int deleted = q.executeUpdate();
SodDB.getSingleton().commit();
logger.info("delete "+deleted+" old "+eventPairClass.getName());
}
TimeInterval lagInterval ;
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TotalLoserEventCleaner.class);
private static final long ONE_WEEK = 7 * 24 * 60 * 60 * 1000;
}