dispatch_retry/
dispatch_retry.rs1mod support;
10
11use ddd_toolkit::{AggregateRoot as _, Repository, dispatch_events};
12use support::{Order, Placed, Publisher, Store};
13
14fn main() {
15 let mut order = Order {
16 id: 1,
17 total: 4200,
18 events: vec![],
19 };
20 order.record_event(Placed(1));
21 order.record_event(Placed(2));
22 let mut store = Store::default();
23 store.save(&order).unwrap();
24 let mut loaded = store.find_by_id(&1).unwrap().unwrap();
25 assert_eq!(loaded.total, 4200);
26 assert!(loaded.pull_events().is_empty());
27
28 let mut publisher = Publisher {
31 fail_at: Some(1),
32 ..Publisher::default()
33 };
34 assert_eq!(
35 dispatch_events(&mut order, &mut publisher),
36 Err("broker down")
37 );
38 assert!(store.exists(&1).unwrap()); assert_eq!(order.events, vec![Placed(1), Placed(2)]);
40 publisher.fail_at = None;
43 dispatch_events(&mut order, &mut publisher).unwrap();
44 assert!(order.pull_events().is_empty());
45 assert_eq!(publisher.accepted, vec![Placed(1), Placed(1), Placed(2)]);
46 println!("dispatch_retry: saved total=4200; retry delivered [1, 1, 2]");
47}