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
}
}