-
Notifications
You must be signed in to change notification settings - Fork 554
/
AdminLifecycle.scala
137 lines (114 loc) · 4.8 KB
/
AdminLifecycle.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package model
import java.util.TimeZone
import java.nio.file.Files.deleteIfExists
import app.LifecycleComponent
import common._
import conf.Configuration
import conf.switches.Switches._
import _root_.jobs._
import play.api.inject.ApplicationLifecycle
import services.EmailService
import tools.{AssetMetricsCache, CloudWatch, LoadBalancer}
import scala.concurrent.duration._
import scala.concurrent.{ExecutionContext, Future}
import conf.AdminConfiguration
class AdminLifecycle(
appLifecycle: ApplicationLifecycle,
jobs: JobScheduler,
pekkoAsync: PekkoAsync,
emailService: EmailService,
fastlyCloudwatchLoadJob: FastlyCloudwatchLoadJob,
r2PagePressJob: R2PagePressJob,
analyticsSanityCheckJob: AnalyticsSanityCheckJob,
rebuildIndexJob: RebuildIndexJob,
)(implicit ec: ExecutionContext)
extends LifecycleComponent
with GuLogging {
appLifecycle.addStopHook { () =>
Future {
descheduleJobs()
CloudWatch.shutdown()
emailService.shutdown()
deleteTmpFiles()
}
}
lazy val adminPressJobStandardPushRateInMinutes: Int = Configuration.faciatool.adminPressJobStandardPushRateInMinutes
lazy val adminPressJobHighPushRateInMinutes: Int = Configuration.faciatool.adminPressJobHighPushRateInMinutes
lazy val adminPressJobLowPushRateInMinutes: Int = Configuration.faciatool.adminPressJobLowPushRateInMinutes
lazy val adminRebuildIndexRateInMinutes: Int = Configuration.indexes.adminRebuildIndexRateInMinutes
lazy val r2PagePressRateInSeconds: Int = Configuration.r2Press.pressRateInSeconds
private def scheduleJobs(): Unit = {
// every 0, 30 seconds past the minute
jobs.schedule("AdminLoadJob", "0/30 * * * * ?") {
model.abtests.AbTestJob.run()
}
// every 4, 19, 34, 49 minutes past the hour, on the 2nd second past the minute (e.g 13:04:02, 13:19:02)
jobs.schedule("LoadBalancerLoadJob", "2 4/15 * * * ?") {
LoadBalancer.refresh()
}
// every 2 minutes starting 5 seconds past the minute (e.g 13:02:05, 13:04:05)
jobs.schedule("FastlyCloudwatchLoadJob", "5 0/2 * * * ?") {
fastlyCloudwatchLoadJob.run()
}
jobs.scheduleEvery("R2PagePressJob", r2PagePressRateInSeconds.seconds) {
r2PagePressJob.run()
}
// every 2, 17, 32, 47 minutes past the hour, on the 12th second past the minute (e.g 13:02:12, 13:17:12)
jobs.schedule("AnalyticsSanityCheckJob", "12 2/15 * * * ?") {
analyticsSanityCheckJob.run()
}
jobs.scheduleEveryNMinutes("FrontPressJobHighFrequency", adminPressJobHighPushRateInMinutes) {
if (FrontPressJobSwitch.isSwitchedOn) RefreshFrontsJob.runFrequency(pekkoAsync)(HighFrequency)
Future.successful(())
}
jobs.scheduleEveryNMinutes("FrontPressJobStandardFrequency", adminPressJobStandardPushRateInMinutes) {
if (FrontPressJobSwitchStandardFrequency.isSwitchedOn)
RefreshFrontsJob.runFrequency(pekkoAsync)(StandardFrequency)
Future.successful(())
}
jobs.scheduleEveryNMinutes("FrontPressJobLowFrequency", adminPressJobLowPushRateInMinutes) {
if (FrontPressJobSwitch.isSwitchedOn) RefreshFrontsJob.runFrequency(pekkoAsync)(LowFrequency)
Future.successful(())
}
// every 2, 17, 32, 47 minutes past the hour, on the 9th second past the minute (e.g 13:02:09, 13:17:09)
jobs.schedule("RebuildIndexJob", s"9 0/$adminRebuildIndexRateInMinutes * 1/1 * ? *") {
rebuildIndexJob.run()
}
val londonTime = TimeZone.getTimeZone("Europe/London")
jobs.scheduleWeekdayJob("ExpiringSwitchesEmailJob", 48, 8, londonTime) {
log.info("Starting ExpiringSwitchesEmailJob")
ExpiringSwitchesEmailJob(emailService).run()
}
jobs.scheduleWeekdayJob("ExpiringSwitchesAfternoonEmailJob", 48, 15, londonTime) {
log.info("Starting ExpiringSwitchesAfternoonEmailJob")
ExpiringSwitchesEmailJob(emailService).runReminder()
}
jobs.scheduleEveryNMinutes("AssetMetricsCache", 60 * 6) {
AssetMetricsCache.run()
}
}
private def descheduleJobs(): Unit = {
jobs.deschedule("AdminLoadJob")
jobs.deschedule("LoadBalancerLoadJob")
jobs.deschedule("FastlyCloudwatchLoadJob")
jobs.deschedule("R2PagePressJob")
jobs.deschedule("AnalyticsSanityCheckJob")
jobs.deschedule("RebuildIndexJob")
jobs.deschedule("FrontPressJobHighFrequency")
jobs.deschedule("FrontPressJobStandardFrequency")
jobs.deschedule("FrontPressJobLowFrequency")
jobs.deschedule("ExpiringSwitchesEmailJob")
jobs.deschedule("ExpiringSwitchesAfternoonEmailJob")
jobs.deschedule("AssetMetricsCache")
}
private def deleteTmpFiles(): Unit = AdminConfiguration.dfpApi.serviceAccountKeyFile.map(deleteIfExists)
override def start(): Unit = {
descheduleJobs()
scheduleJobs()
pekkoAsync.after1s {
rebuildIndexJob.run()
AssetMetricsCache.run()
LoadBalancer.refresh()
}
}
}