Skip to main content

a3s_flow/worker/
queue.rs

1use async_trait::async_trait;
2
3use crate::error::Result;
4
5use super::{FlowTask, FlowTaskLease};
6
7/// Queue abstraction for workflow dispatch.
8#[async_trait]
9pub trait FlowTaskQueue: Send + Sync {
10    async fn enqueue(&self, task: FlowTask) -> Result<()>;
11
12    async fn lease(&self) -> Result<Option<FlowTaskLease>>;
13
14    async fn ack(&self, lease_id: &str) -> Result<()>;
15
16    async fn requeue_inflight(&self) -> Result<usize> {
17        Ok(0)
18    }
19
20    async fn dequeue(&self) -> Result<Option<FlowTask>> {
21        let Some(lease) = self.lease().await? else {
22            return Ok(None);
23        };
24        let task = lease.task.clone();
25        self.ack(&lease.lease_id).await?;
26        Ok(Some(task))
27    }
28
29    async fn len(&self) -> Result<usize>;
30
31    async fn is_empty(&self) -> Result<bool> {
32        Ok(self.len().await? == 0)
33    }
34}