Block scheduler if another one is already running
All checks were successful
Build and push container image / build (push) Successful in 12m40s

This commit is contained in:
toast 2024-08-02 21:05:29 +10:00
parent 483ba390e9
commit 048ce583e8
4 changed files with 29 additions and 15 deletions

2
Cargo.lock generated
View File

@ -1020,7 +1020,7 @@ dependencies = [
[[package]]
name = "kon"
version = "0.3.8"
version = "0.3.9"
dependencies = [
"bb8",
"bb8-postgres",

View File

@ -1,6 +1,6 @@
[package]
name = "kon"
version = "0.3.8"
version = "0.3.9"
edition = "2021"
[dependencies]

View File

@ -17,7 +17,13 @@ use crate::{
use std::{
thread::current,
sync::Arc
sync::{
Arc,
atomic::{
AtomicBool,
Ordering
}
}
};
use poise::serenity_prelude::{
builder::{
@ -35,6 +41,7 @@ use poise::serenity_prelude::{
};
type Error = Box<dyn std::error::Error + Send + Sync>;
static TASK_RUNNING: AtomicBool = AtomicBool::new(false);
async fn on_ready(
ctx: &Context,
@ -123,17 +130,24 @@ async fn event_processor(
let ctx = Arc::new(ctx.clone());
tokio::spawn(async move {
match internals::tasks::rss::rss(ctx).await {
Ok(_) => {},
Err(y) => {
eprintln!("TaskScheduler[Main:RSS:Error]: Task execution failed: {}", y);
if let Some(source) = y.source() {
eprintln!("TaskScheduler[Main:RSS:Error]: Task execution failed caused by: {:#?}", source);
if !TASK_RUNNING.load(Ordering::SeqCst) {
TASK_RUNNING.store(true, Ordering::SeqCst);
tokio::spawn(async move {
match internals::tasks::rss::rss(ctx).await {
Ok(_) => {},
Err(y) => {
eprintln!("TaskScheduler[Main:RSS:Error]: Task execution failed: {}", y);
if let Some(source) = y.source() {
eprintln!("TaskScheduler[Main:RSS:Error]: Task execution failed caused by: {:#?}", source);
}
}
}
}
});
TASK_RUNNING.store(false, Ordering::SeqCst);
});
} else {
println!("TaskScheduler[Main:RSS:Notice]: Another thread is already running this task, ignoring");
}
}
_ => {}
}