tina-core 0.0.2

Tina platform
Documentation
//! Application扩展
use crate::tina::core::service::lock_service::IDistributedLockService;
use crate::tina::data::AppResult;
use crate::tina::redis::lock_service::RedisDistributedLock;
use crate::tina::redis::IRedisClient;
use crate::tina::server::application::{Application, ApplicationExt};
use std::future::Future;
use std::time::Duration;
use tokio::time::sleep;

#[crate::async_trait]
impl ApplicationExt for Application {
    async fn sleep_current(&self, duration: Duration) {
        sleep(duration).await;
    }

    fn spawn<F: Future<Output = AppResult<R>> + Send + 'static, R: Send + 'static>(&self, fut: F) -> AppResult<()> {
        tokio::spawn(fut);
        Ok(())
    }

    async fn execute_with_distributed_mutex<Lock, F, R>(
        &self,
        key: &str,
        value: Option<Lock>,
        lock_timeout: Duration,
        retry_interval: Duration,
        fut: F,
    ) -> AppResult<R>
    where
        Lock: ToString + Send + 'static,
        F: Future<Output = AppResult<R>> + Send + 'static,
        R: Send + 'static,
    {
        let mut lock = RedisDistributedLock(self.get_redis_client()?, None);
        lock.lock(key, value, lock_timeout, retry_interval, fut).await
    }
}