📝

Rustで常駐プログラムのライブラリ公開

2024/02/22に公開

目的

Rustで常駐プログラムでタスクがある限り仕事するで常駐プログラムシリーズを続けています。
今回はその集大成として、ライブラリとして公開しました。

変更

ライブラリの公開に合わせてインターフェースを見直しました。

  • 停止チェックの秒数を渡していものをDurationに変更
    これにより秒よりも短い時間も制御できるようになります。
  • 関数の引数をコネクションからResult型に変更
    エラーのハンドリングは呼び出し側が制御すべきと考えました。
  • 停止の関数にもDBのコネクションを渡す
  • 関数の戻り値をenumに変更。詳細は下記

LoopState

関数が返す値をenumにしました。

  • Continue 処理を継続する
  • Terminate 処理を停止する。このスレッドは停止する。
  • AllTerminate 処理を停止する。全てのスレッドと停止してプロセスを停止する。
  • Duration 処理は継続するが指定した時間sleepする

シグネチャー

pub fn make_looper<Fut1, Fut2>(
    pg_pool: deadpool_postgres::Pool,
    token: CancellationToken,
    expression: &str,
    stop_check_duration: Duration,
    task_function: impl Fn(DateTime<Utc>, Result<deadpool_postgres::Client, deadpool_postgres::PoolError>) -> Fut1
        + Send
        + Sync
        + 'static,
    stop_function: impl Fn(Result<deadpool_postgres::Client, deadpool_postgres::PoolError>) -> Fut2
        + Send
        + Sync
        + 'static,
) -> JoinHandle<()>
where
    Fut1: Future<Output = LoopState> + Send,
    Fut2: Future<Output = ()> + Send,
{...}

pub fn make_worker<Fut1, Fut2>(
    pg_pool: deadpool_postgres::Pool,
    token: CancellationToken,
    stop_check_duration: Duration,
    task_function: impl Fn(DateTime<Utc>, Result<deadpool_postgres::Client, deadpool_postgres::PoolError>) -> Fut1
        + Send
        + Sync
        + 'static,
    stop_function: impl Fn(Result<deadpool_postgres::Client, deadpool_postgres::PoolError>) -> Fut2
        + Send
        + Sync
        + 'static,
) -> JoinHandle<()>
where
    Fut1: Future<Output = LoopState> + Send,
    Fut2: Future<Output = ()> + Send,
{...}

追加

featureでredisとpostgresを提供しました。更に両方が指定されている場合は関数task_functionでredisとpostgresqlのコネクションを渡すようにしました。

コード

コードは以下にあります。動作するコードはexampleにあります。
リポジトリ

Discussion