use std::time::Duration;
use ruststream_fred::stream::prelude::*;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Order {
id: u64,
}
#[subscriber(RedisStream::new("billing").group("workers"))]
async fn bill_order(order: &Order) -> HandlerOutcome {
if order.id == 0 {
return HandlerOutcome::retry_after(Duration::from_secs(30));
}
println!("billed order {}", order.id);
HandlerOutcome::ack()
}
#[subscriber(
RedisStream::new("orders")
.group("workers")
.delayed_retry(DelayedRetry::DurableZset { key: "orders.delayed".to_owned(), ttl: None })
)]
async fn handle_order(order: &Order) -> HandlerOutcome {
if order.id == 0 {
return HandlerOutcome::retry_after(Duration::from_secs(30));
}
println!("processed order {}", order.id);
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(
RedisBroker::standalone("redis://localhost:6379"),
|b| {
b.include(bill_order).out_retry(Publish);
b.include(handle_order);
},
)
}