basic/
basic.rs

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
use std::time::Duration;

use persistent_scheduler::core::{
    context::{TaskAndDelay, TaskContext},
    store::InMemoryTaskStore,
    task::{Task, TaskFuture},
    task_kind::TaskKind,
};
use serde::{Deserialize, Serialize};

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .init();

    let task_store = InMemoryTaskStore::new();
    let context = TaskContext::new(task_store)
        .register::<MyTask1>()
        .register::<MyTask2>()
        .set_concurrency("default", 10)
        .start()
        .await;
    let mut tasks = Vec::new();
    for _ in 0..100 {
        tasks.push(TaskAndDelay {
            inner: MyTask1::new("name1".to_string(), 32),
            delay_seconds: None,
        });
    }

    tokio::spawn(async move {
        context.add_tasks(tasks).await.unwrap();
    });
    tokio::time::sleep(Duration::from_secs(20)).await;
}

#[derive(Clone, Debug, Deserialize, Serialize)]
struct MyTask1 {
    pub name: String,
    pub age: i32,
}

impl MyTask1 {
    pub fn new(name: String, age: i32) -> Self {
        Self { name, age }
    }
}

impl Task for MyTask1 {
    const TASK_KEY: &'static str = "my_task_a";

    const TASK_QUEUE: &'static str = "default";

    const TASK_KIND: TaskKind = TaskKind::Once;
    //const RETRY_POLICY: RetryPolicy = RetryPolicy::linear(10, Some(5));

    fn run(self) -> TaskFuture {
        Box::pin(async move {
            // println!("{}", self.name);
            // println!("{}", self.age);
            //tokio::time::sleep(Duration::from_secs(15)).await;
            // println!("my task1 is running");
            Ok(())
        })
    }
}

#[derive(Clone, Debug, Deserialize, Serialize)]
struct MyTask2 {
    pub name: String,
    pub age: i32,
}

impl MyTask2 {
    pub fn new(name: String, age: i32) -> Self {
        Self { name, age }
    }
}

impl Task for MyTask2 {
    const TASK_KEY: &'static str = "my_task_b";
    const TASK_QUEUE: &'static str = "default";
    const TASK_KIND: TaskKind = TaskKind::Repeat;
    const REPEAT_INTERVAL: Option<u32> = Some(10);
    //const SCHEDULE: Option<&'static str> = Some("1/10 * * * * *");
    //const TIMEZONE: Option<&'static str> = Some("Asia/Shanghai");

    fn run(self) -> TaskFuture {
        Box::pin(async move {
            println!("{}", self.name);
            println!("{}", self.age);
            tokio::time::sleep(Duration::from_secs(100000)).await;
            println!("my task2 is running");
            Ok(())
        })
    }
}