Skip to content

Commit

Permalink
Merge pull request #22 from BinChengZhao/feature/stable
Browse files Browse the repository at this point in the history
Version 0.9.0
  • Loading branch information
BinChengZhao authored Oct 5, 2021
2 parents 41fb5fe + 2123e03 commit 790aa0a
Show file tree
Hide file tree
Showing 19 changed files with 609 additions and 168 deletions.
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
# Version 0.9.0

v0.9.0 New features:


1. Add more user-friendly api for better experience!

1.1. Gradually deprecating TaskBuilder api `set_frequency` & `set_frequency_by_candy`.
1.2. Add more user-friendly api such as `set_frequency_once_by_timestamp_seconds` | `set_frequency_count_down_by_days` | `set_frequency_repeated_by_cron_str` these having better experience.


Update dependency :

Update cron_clock .

Update examples:

Change, async-std & tokio & demo & generic & increase use cases.

Enriched Unit tests & documentation.
# Version 0.8.2

v0.8.2 New features:
Expand Down
5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "delay_timer"
version = "0.8.3"
version = "0.9.0"
authors = ["binchengZhao <binchengZhao@outlook.com>"]
edition = "2018"
repository = "https://github.com/BinChengZhao/delay-timer"
Expand Down Expand Up @@ -29,7 +29,7 @@ status-report = []


[dependencies]
cron_clock = "0.7.0"
cron_clock = "0.8.0"
anyhow = "^1.0.31"
rs-snowflake = "0.5.0"
dashmap = "^4.0.2"
Expand All @@ -47,6 +47,7 @@ thiserror = "^1.0.24"
tokio = { version = "^1.3.0", features = ["full"] , optional = true }

[dev-dependencies]
rand = "0.8.4"
surf = "^2.1.0"
tokio = { version = "^1.3.0", features = ["full"] }
hyper= {version = "^0.14.2" , features = ["full"] }
Expand Down
31 changes: 6 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ such as Sunday at 4am to execute a backup task.

![image](https://github.com/BinChengZhao/delay-timer/blob/master/structural_drawing/DelayTImer.png)

### If you're looking for a distributed task scheduling platform, check out the [delicate](https://github.com/BinChengZhao/delicate)


## Examples

Expand Down Expand Up @@ -69,7 +71,7 @@ fn build_task_async_print() -> Result<Task, TaskError> {

task_builder
.set_task_id(1)
.set_frequency_by_candy(CandyFrequency::Repeated(CandyCron::Secondly))
.set_frequency_repeated_by_seconds(1)
.set_maximum_parallel_runnable_num(2)
.spawn(body)
}
Expand Down Expand Up @@ -124,7 +126,7 @@ fn build_task_async_print() -> Result<Task, TaskError> {

task_builder
.set_task_id(1)
.set_frequency(Frequency::Repeated("*/6 * * * * * *"))
.set_frequency_repeated_by_seconds(6)
.set_maximum_parallel_runnable_num(2)
.spawn(body)
}
Expand Down Expand Up @@ -156,7 +158,7 @@ fn build_task_async_print() -> Result<Task, TaskError> {
});

let task = TaskBuilder::default()
.set_frequency_by_candy(CandyFrequency::CountDown(9, CandyCron::Secondly))
.set_frequency_count_down_by_seconds(1, 9)
.set_task_id(1)
.set_maximum_parallel_runnable_num(3)
.spawn(body)?;
Expand All @@ -178,7 +180,7 @@ fn build_task_customized_async_task() -> Result<Task, TaskError> {

let body = generate_closure_template("delay_timer is easy to use. .".into());
task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(AuspiciousTime::LoveTime))
.set_frequency_repeated_by_cron_str("0,10,15,25,50 0/1 * * Jan-Dec * 2020-2100")
.set_task_id(5)
.set_maximum_running_time(5)
.spawn(body)
Expand Down Expand Up @@ -206,21 +208,6 @@ pub async fn async_template(id: i32, name: String) -> Result<()> {
Ok(())
}

enum AuspiciousTime {
PerSevenSeconds,
PerEightSeconds,
LoveTime,
}

impl Into<CandyCronStr> for AuspiciousTime {
fn into(self) -> CandyCronStr {
match self {
Self::PerSevenSeconds => CandyCronStr("0/7 * * * * * *".to_string()),
Self::PerEightSeconds => CandyCronStr("0/8 * * * * * *".to_string()),
Self::LoveTime => CandyCronStr("0,10,15,25,50 0/1 * * Jan-Dec * 2020-2100".to_string()),
}
}
}
```

There's a lot more in the [examples] directory.
Expand All @@ -240,16 +227,10 @@ Licensed under either of
- [ ] neaten todo in code, replenish tests and benchmark.
- [ ] batch-opration.
- [x] report-for-server.
- [ ] TASK-TAG.
- [ ] Future upgrade of delay_timer to multi-wheel mode, different excutor handling different wheels e.g. subtract laps for one wheel, run task for one wheel.

#### Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.


#### The author comments:

#### Make an upgrade plan for smooth updates in the future, Such as stop serve back-up ` unfinished task` then up new version serve load task.bak, Runing.
12 changes: 6 additions & 6 deletions examples/cycle_tokio_task.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#![allow(deprecated)]

use anyhow::Result;
use delay_timer::prelude::*;
use hyper::{Client, Uri};
Expand Down Expand Up @@ -31,7 +33,7 @@ fn build_task_customized_async_task() -> Result<Task> {
let body = generate_closure_template("'delay_timer-is-easy-to-use.'".into());

Ok(task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(AuspiciousDay::Work))
.set_frequency_repeated_by_cron_str("10,15,25,50 0/1 * * Jan-Dec * 2020-2100")
.set_task_id(5)
.set_maximum_running_time(15)
.spawn(body)?)
Expand Down Expand Up @@ -72,9 +74,9 @@ pub fn generate_closure_template(
pub async fn async_template(id: i32, name: String) -> Result<()> {
let client = Client::new();

//The default connector does not handle TLS.
//Speaking to https destinations will require configuring a connector that implements TLS.
//So use http for test.
// The default connector does not handle TLS.
// Speaking to https destinations will require configuring a connector that implements TLS.
// So use http for test.
let url = format!("http://httpbin.org/get?id={}&name={}", id, name);
let uri: Uri = url.parse()?;

Expand All @@ -87,14 +89,12 @@ pub async fn async_template(id: i32, name: String) -> Result<()> {
}

enum AuspiciousDay {
Work,
Wake,
}

impl Into<CandyCronStr> for AuspiciousDay {
fn into(self) -> CandyCronStr {
match self {
Self::Work => CandyCronStr("10,15,25,50 0/1 * * Jan-Dec * 2020-2100".to_string()),
Self::Wake => CandyCronStr("0 * * * Jan-Dec * 2020-2100".to_string()),
}
}
Expand Down
9 changes: 5 additions & 4 deletions examples/demo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ fn build_task_async_print() -> Result<Task, TaskError> {

task_builder
.set_task_id(1)
.set_frequency_by_candy(CandyFrequency::Repeated(CandyCron::Secondly))
.set_frequency_repeated_by_cron_str("@secondly")
.set_maximum_parallel_runnable_num(2)
.spawn(body)
}
Expand All @@ -73,7 +73,7 @@ fn build_task_async_request() -> Result<Task, TaskError> {
});

task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(AuspiciousTime::PerEightSeconds))
.set_frequency_repeated_by_seconds(8)
.set_task_id(2)
.set_maximum_running_time(5)
.spawn(body)
Expand All @@ -84,7 +84,7 @@ fn build_task_async_execute_process() -> Result<Task, TaskError> {

let body = unblock_process_task_fn("php /home/open/project/rust/repo/myself/delay_timer/examples/try_spawn.php >> ./try_spawn.txt".into());
task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(CandyCron::Minutely))
.set_frequency_repeated_by_minutes(1)
.set_task_id(3)
.set_maximum_running_time(5)
.spawn(body)
Expand All @@ -94,6 +94,7 @@ fn build_task_customized_async_task() -> Result<Task, TaskError> {
let mut task_builder = TaskBuilder::default();

let body = generate_closure_template("delay_timer is easy to use. .".into());
#[allow(deprecated)]
task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(AuspiciousTime::LoveTime))
.set_task_id(5)
Expand Down Expand Up @@ -133,7 +134,7 @@ fn build_wake_task() -> Result<Task, TaskError> {
};

task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(CandyCron::Minutely))
.set_frequency_repeated_by_cron_str("@minutely")
.set_task_id(700)
.set_maximum_running_time(50)
.spawn(body)
Expand Down
11 changes: 5 additions & 6 deletions examples/demo_async_std.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use delay_timer::prelude::*;
#![allow(deprecated)]

use anyhow::Result;

use delay_timer::prelude::*;
use smol::Timer;
use std::{ops::Deref, time::Duration};
use std::time::Duration;

// You can replace the 62 line with the command you expect to execute.
#[async_std::main]
Expand Down Expand Up @@ -47,11 +47,10 @@ fn build_task_async_print() -> Result<Task, TaskError> {

println!("create_async_fn_body:i'success");
});
let s = String::from("*/6 * * * * * *");
let s_r = (&s).deref();

task_builder
.set_task_id(1)
.set_frequency(Frequency::Repeated(s_r))
.set_frequency_repeated_by_cron_str("*/6 * * * * * *")
.set_maximum_parallel_runnable_num(2)
.spawn(body)
}
Expand Down
8 changes: 3 additions & 5 deletions examples/demo_async_tokio.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use delay_timer::prelude::*;

use anyhow::Result;

use delay_timer::prelude::*;
use smol::Timer;
use std::time::Duration;

Expand Down Expand Up @@ -54,7 +52,7 @@ fn build_task_async_print() -> Result<Task, TaskError> {

task_builder
.set_task_id(1)
.set_frequency(Frequency::Repeated("*/6 * * * * * *"))
.set_frequency_repeated_by_seconds(6)
.set_maximum_parallel_runnable_num(2)
.spawn(body)
}
Expand All @@ -64,7 +62,7 @@ fn build_task_async_execute_process() -> Result<Task, TaskError> {

let body = unblock_process_task_fn("php /home/open/project/rust/repo/myself/delay_timer/examples/try_spawn.php >> ./try_spawn.txt".into());
task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(CandyCron::Secondly))
.set_frequency_repeated_by_seconds(1)
.set_task_id(3)
.set_maximum_running_time(10)
.set_maximum_parallel_runnable_num(1)
Expand Down
6 changes: 4 additions & 2 deletions examples/dynamic_cancel.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#![allow(deprecated)]

use anyhow::Result;
use delay_timer::prelude::*;
use smol::Timer;
Expand Down Expand Up @@ -85,7 +87,7 @@ fn build_task_async_print() -> Result<Task, TaskError> {

task_builder
.set_task_id(1)
.set_frequency(Frequency::Repeated("*/6 * * * * * *"))
.set_frequency_repeated_by_seconds(6)
.set_maximum_parallel_runnable_num(2)
.spawn(body)
}
Expand All @@ -95,7 +97,7 @@ fn build_task_async_execute_process() -> Result<Task, TaskError> {

let body = tokio_unblock_process_task_fn("php /home/open/project/rust/repo/myself/delay_timer/examples/try_spawn.php >> ./try_spawn.txt".into());
task_builder
.set_frequency_by_candy(CandyFrequency::Repeated(CandyCron::Secondly))
.set_frequency_repeated_by_seconds(1)
.set_task_id(3)
.set_maximum_running_time(10)
.set_maximum_parallel_runnable_num(1)
Expand Down
4 changes: 3 additions & 1 deletion examples/generic.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#![allow(deprecated)]

use anyhow::Result;
use delay_timer::prelude::*;
use smol::Timer;
Expand Down Expand Up @@ -43,7 +45,7 @@ fn build_generic_task_async_request<T: Animal>(animal: T) -> Result<Task, TaskEr
});

task_builder
.set_frequency(Frequency::CountDown(15, "* * * * * * *"))
.set_frequency_count_down_by_seconds(1, 15)
.set_task_id(2)
.set_maximum_running_time(5)
.spawn(body)
Expand Down
13 changes: 7 additions & 6 deletions examples/increase.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
use delay_timer::prelude::*;
#![allow(deprecated)]

use surf;

use delay_timer::prelude::*;
use std::ops::Deref;
use std::ptr::NonNull;
use std::sync::atomic::{AtomicUsize, Ordering::SeqCst};
use std::sync::Arc;
use std::thread::{current, park, Thread};

use surf;

#[derive(Debug, Clone, Copy)]
struct SafePointer(NonNull<Arc<AtomicUsize>>);

Expand Down Expand Up @@ -44,23 +45,23 @@ fn main() -> AnyResult<()> {

// The common task attr.
task_builder
.set_frequency(Frequency::CountDown(1, "30 * * * * * *"))
.set_frequency_once_by_seconds(30)
.set_maximum_running_time(90);

for i in 0..1000 {
let task = task_builder.set_task_id(i).spawn(body)?;
delay_timer.add_task(task)?;
}

task_builder.set_frequency(Frequency::CountDown(1, "58 * * * * * *"));
task_builder.set_frequency_count_down_by_seconds(58, 1);
for i in 1000..1300 {
let task = task_builder.set_task_id(i).spawn(async_body)?;
delay_timer.add_task(task)?;
}

let task = task_builder
.set_task_id(8888)
.set_frequency(Frequency::CountDown(1, "@minutely"))
.set_frequency_once_by_minutes(1)
.spawn(end_body)?;
delay_timer.add_task(task)?;

Expand Down
1 change: 1 addition & 0 deletions examples/profile_memory.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![allow(deprecated)]
use delay_timer::prelude::*;
use std::thread::sleep;
use std::time::Duration;
Expand Down
7 changes: 5 additions & 2 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use crate::prelude::*;
pub enum TaskError {
/// Error variant for Cron expression parsing.
#[error("Cron expression analysis error.")]
CronExpressionAnalyzeError(#[from] CronExpressionAnalyzeError),
FrequencyAnalyzeError(#[from] FrequencyAnalyzeError),
/// Task sending failure.
#[error("Task sending failure.")]
DisSend(#[from] channel::TrySendError<TimerEvent>),
Expand Down Expand Up @@ -44,11 +44,14 @@ pub enum TaskInstanceError {

/// Error enumeration for Cron expression parsing.
#[derive(Error, Debug)]
pub enum CronExpressionAnalyzeError {
pub enum FrequencyAnalyzeError {
/// Access to thread local storage failed.
#[error("Thread local storage access failed.")]
DisAccess(#[from] std::thread::AccessError),
/// Irregular cron expressions that cause parsing failures.
#[error("The cron expression was parsed incorrectly.")]
DisParse(#[from] cron_error::Error),
/// The initialization time is wrong.
#[error("The initialization time is wrong.")]
DisInitTime,
}
Loading

0 comments on commit 790aa0a

Please sign in to comment.