Refactor to break out scheduler
This commit is contained in:
11
crates/scheduler/Cargo.toml
Normal file
11
crates/scheduler/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "scheduler"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
lib = { path = "../lib" }
|
||||
chrono = "0.4.42"
|
||||
tokio = { version = "1.47.1", features = ["rt", "rt-multi-thread"] }
|
||||
log = "0.4.28"
|
||||
env_logger = "0.11.8"
|
||||
24
crates/scheduler/Dockerfile
Normal file
24
crates/scheduler/Dockerfile
Normal file
@@ -0,0 +1,24 @@
|
||||
# =========
|
||||
# Builder
|
||||
# =========
|
||||
FROM rust:bookworm AS builder
|
||||
WORKDIR /builder
|
||||
|
||||
COPY crates/lib /lib
|
||||
COPY crates/scheduler/src ./src
|
||||
COPY crates/scheduler/Cargo.toml ./
|
||||
|
||||
RUN apt-get update && apt-get install -y cmake
|
||||
RUN cargo build --release
|
||||
|
||||
# =========
|
||||
# Runtime
|
||||
# =========
|
||||
FROM debian:bookworm-slim AS runtime
|
||||
WORKDIR /scheduler
|
||||
RUN apt-get update && apt-get install -y openssl libpq-dev ca-certificates
|
||||
USER root
|
||||
|
||||
COPY --from=builder /builder/target/release/scheduler /usr/local/bin/scheduler
|
||||
|
||||
CMD ["scheduler"]
|
||||
56
crates/scheduler/src/main.rs
Normal file
56
crates/scheduler/src/main.rs
Normal file
@@ -0,0 +1,56 @@
|
||||
use chrono::{DateTime, Utc};
|
||||
use std::env;
|
||||
use std::time::{Duration, Instant};
|
||||
use env_logger::Builder;
|
||||
use log::LevelFilter;
|
||||
use tokio::time::interval;
|
||||
use lib::metars::Metar;
|
||||
use lib::state::AppState;
|
||||
|
||||
#[tokio::main]
|
||||
pub async fn main() {
|
||||
Builder::new()
|
||||
.filter_level(LevelFilter::Info) // Set a default log level
|
||||
.filter_module("scheduler", LevelFilter::Trace)
|
||||
.filter_module("lib", LevelFilter::Trace)
|
||||
.init();
|
||||
|
||||
let state = match AppState::new().await {
|
||||
Ok(state) => state,
|
||||
Err(err) => {
|
||||
log::error!("Failed to create state: {}", err);
|
||||
return;
|
||||
}
|
||||
};
|
||||
let seconds = env::var("METAR_INTERVAL")
|
||||
.unwrap_or("300".to_string())
|
||||
.parse::<u64>()
|
||||
.unwrap_or(300);
|
||||
|
||||
// Create an interval ticker
|
||||
let mut interval = interval(Duration::from_secs(seconds));
|
||||
let mut etag = None;
|
||||
|
||||
loop {
|
||||
interval.tick().await;
|
||||
|
||||
// Record start times
|
||||
let start_monotonic = Instant::now();
|
||||
let start_utc: DateTime<Utc> = Utc::now();
|
||||
log::debug!("METAR update started at {}", start_utc);
|
||||
|
||||
// Run the update
|
||||
match Metar::update_metars(&state, etag.clone()).await {
|
||||
Ok(new_etag) => etag = Some(new_etag),
|
||||
Err(err) => log::error!("METAR update failed: {}", err),
|
||||
}
|
||||
|
||||
let elapsed = start_monotonic.elapsed();
|
||||
let next_utc = Utc::now() + chrono::Duration::from_std(Duration::from_secs(seconds)).unwrap();
|
||||
log::info!(
|
||||
"METAR update finished in {:.2?}; next run at {}",
|
||||
elapsed,
|
||||
next_utc
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user