diff --git a/src/org/leolo/rail/Constants.java b/src/org/leolo/rail/Constants.java index 2c2caa2..bf3c38f 100644 --- a/src/org/leolo/rail/Constants.java +++ b/src/org/leolo/rail/Constants.java @@ -13,6 +13,8 @@ public class Constants { public static final long DEFAULT_SLEEP_TIME = 1000; public static final long INCRESE_RATIO = 2; public static final boolean DEBUG_MODE = false; + public static final long MAX_SLEEP_TIME = 128000; + public static final int DATA_RETAINTION_PERIOD = 7; } public static class Scheduler{ diff --git a/src/org/leolo/rail/NRDataDamon.java b/src/org/leolo/rail/NRDataDamon.java index 8482b97..ffd01bc 100644 --- a/src/org/leolo/rail/NRDataDamon.java +++ b/src/org/leolo/rail/NRDataDamon.java @@ -12,6 +12,7 @@ import org.apache.activemq.transport.stomp.StompFrame; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.leolo.rail.dao.MetadataDao; +import org.leolo.rail.job.DayEndJob; import org.leolo.rail.job.LongTermScheduleJob; import org.quartz.CronScheduleBuilder; import org.quartz.DateBuilder; @@ -73,6 +74,18 @@ public class NRDataDamon { .withSchedule(CronScheduleBuilder.cronSchedule("30 30 2 * * ?")) .build(); scheduler.scheduleJob(jd, t); + jd = JobBuilder.newJob(DayEndJob.class).withIdentity("J-DE-OF", Constants.Scheduler.DEFAULT_GROUP_NAME).build(); + t = TriggerBuilder.newTrigger() + .withIdentity("T-DE-OF", Constants.Scheduler.DEFAULT_GROUP_NAME) + .startAt(DateBuilder.evenMinuteDateAfterNow()) + .build(); + scheduler.scheduleJob(jd, t); + jd = JobBuilder.newJob(DayEndJob.class).withIdentity("J-DE-C", Constants.Scheduler.DEFAULT_GROUP_NAME).build(); + t = TriggerBuilder.newTrigger() + .withIdentity("T-DE-C", Constants.Scheduler.DEFAULT_GROUP_NAME) + .withSchedule(CronScheduleBuilder.cronSchedule("15 15 6 * * ?")) + .build(); + scheduler.scheduleJob(jd, t); } catch (SQLException e) { log.atError().log(e.getMessage(), e); diff --git a/src/org/leolo/rail/job/DayEndJob.java b/src/org/leolo/rail/job/DayEndJob.java index c3bf3af..e3a56af 100644 --- a/src/org/leolo/rail/job/DayEndJob.java +++ b/src/org/leolo/rail/job/DayEndJob.java @@ -1,15 +1,193 @@ package org.leolo.rail.job; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.leolo.rail.Constants; +import org.leolo.rail.DatabaseManager; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class DayEndJob implements Job { + private Logger log = LogManager.getLogger(DayEndJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { // TODO Auto-generated method stub - + log.atInfo().log("Start day-end job"); + try(Connection conn = DatabaseManager.getInstance().getConnection()){ + Calendar c = Calendar.getInstance(); + c.add(Calendar.DAY_OF_MONTH, -1*Constants.Generic.DATA_RETAINTION_PERIOD); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + log.atInfo().log("Removing data on or before {}", sdf.format(c.getTime())); + String cutoffDate = sdf.format(c.getTime()); + //Delete LTP main records + try( + PreparedStatement psQuery = conn.prepareStatement("SELECT suid FROM ltp_schedule WHERE end_date < ?"); + ){ + psQuery.setString(1, cutoffDate); + try( + ResultSet rs = psQuery.executeQuery(); + PreparedStatement psLoc = conn.prepareStatement("DELETE FROM ltp_location WHERE suid = ?"); + PreparedStatement psSch = conn.prepareStatement("DELETE FROM ltp_schedule WHERE suid = ?"); + ){ + int schCount = 0; + while(rs.next()) { + psLoc.setString(1, rs.getString(1)); + psSch.setString(1, rs.getString(1)); + psLoc.executeUpdate(); + psSch.executeUpdate(); + conn.commit(); + schCount++; + } + log.atInfo().log("Deleted {} LTP schedules.", schCount); + } + } catch (SQLException e) { + log.atError().log(e.getMessage(), e); + }//Delete LTP main records + try( + PreparedStatement psQuery = conn.prepareStatement("SELECT suid FROM stp_schedule WHERE end_date < ?"); + ){ + psQuery.setString(1, cutoffDate); + try( + ResultSet rs = psQuery.executeQuery(); + PreparedStatement psLoc = conn.prepareStatement("DELETE FROM stp_location WHERE suid = ?"); + PreparedStatement psSch = conn.prepareStatement("DELETE FROM stp_schedule WHERE suid = ?"); + ){ + int schCount = 0; + while(rs.next()) { + psLoc.setString(1, rs.getString(1)); + psSch.setString(1, rs.getString(1)); + psLoc.executeUpdate(); + psSch.executeUpdate(); + conn.commit(); + schCount++; + } + log.atInfo().log("Deleted {} STP schedules.", schCount); + } + } catch (SQLException e) { + log.atError().log(e.getMessage(), e); + } + //Delete LTP association records + try( + PreparedStatement psQuery = conn.prepareStatement("SELECT auid FROM ltp_assoication WHERE end_date < ?"); + ){ + psQuery.setString(1, cutoffDate); + try( + ResultSet rs = psQuery.executeQuery(); + PreparedStatement psSch = conn.prepareStatement("DELETE FROM ltp_assoication WHERE auid = ?"); + ){ + int assoCount = 0; + while(rs.next()) { + psSch.setString(1, rs.getString(1)); + psSch.executeUpdate(); + conn.commit(); + assoCount++; + } + log.atInfo().log("Deleted {} assocication.", assoCount); + } + } catch (SQLException e) { + log.atError().log(e.getMessage(), e); + } + //Delete Movements + try( + PreparedStatement psQuery = conn.prepareStatement("SELECT DISTINCT train_id FROM current_train_movement WHERE movt_time < ?"); + ){ + psQuery.setString(1, cutoffDate); + int movtCount = 0; + try( + ResultSet rs = psQuery.executeQuery(); + PreparedStatement psDel = conn.prepareStatement("DELETE FROM current_train_movement WHERE train_id = ? "); + ){ + while(rs.next()) { + psDel.setString(1, rs.getString(1)); + psDel.executeUpdate(); + conn.commit(); + movtCount++; + } + log.atInfo().log("Deleted movement records for {} trains.", movtCount); + + } + }catch (SQLException e) { + log.atError().log(e.getMessage(), e); + } + //Delete cancellation + try( + PreparedStatement psQuery = conn.prepareStatement("SELECT DISTINCT train_id FROM current_train_cancellation WHERE canx_time < ?"); + ){ + psQuery.setString(1, cutoffDate); + int movtCount = 0; + try( + ResultSet rs = psQuery.executeQuery(); + PreparedStatement psDel = conn.prepareStatement("DELETE FROM current_train_cancellation WHERE train_id = ? "); + ){ + while(rs.next()) { + psDel.setString(1, rs.getString(1)); + psDel.executeUpdate(); + conn.commit(); + movtCount++; + } + log.atInfo().log("Deleted cancellation records for {} trains.", movtCount); + + } + }catch (SQLException e) { + log.atError().log(e.getMessage(), e); + } + //Delete Movements + try( + PreparedStatement psQuery = conn.prepareStatement("SELECT DISTINCT train_id FROM current_train_reinstatement WHERE rein_time < ?"); + ){ + psQuery.setString(1, cutoffDate); + int movtCount = 0; + try( + ResultSet rs = psQuery.executeQuery(); + PreparedStatement psDel = conn.prepareStatement("DELETE FROM current_train_reinstatement WHERE train_id = ? "); + ){ + while(rs.next()) { + psDel.setString(1, rs.getString(1)); + psDel.executeUpdate(); + conn.commit(); + movtCount++; + } + log.atInfo().log("Deleted reinstatement records for {} trains.", movtCount); + + } + }catch (SQLException e) { + log.atError().log(e.getMessage(), e); + } + //Delete activation + try( + PreparedStatement psQuery = conn.prepareStatement("SELECT DISTINCT train_id FROM current_train WHERE op_date < ?"); + ){ + psQuery.setString(1, cutoffDate); + int movtCount = 0; + try( + ResultSet rs = psQuery.executeQuery(); + PreparedStatement psDel = conn.prepareStatement("DELETE FROM current_train WHERE train_id = ? "); + ){ + while(rs.next()) { + psDel.setString(1, rs.getString(1)); + psDel.executeUpdate(); + conn.commit(); + movtCount++; + } + log.atInfo().log("Deleted activation records for {} trains.", movtCount); + + } + }catch (SQLException e) { + log.atError().log(e.getMessage(), e); + } + } catch (SQLException e) { + log.atError().log(e.getMessage(), e); + } } }