diff --git a/akka-persistence-rs-commitlog/src/lib.rs b/akka-persistence-rs-commitlog/src/lib.rs
index 164aeba..cfe5ba9 100644
--- a/akka-persistence-rs-commitlog/src/lib.rs
+++ b/akka-persistence-rs-commitlog/src/lib.rs
@@ -598,7 +598,7 @@ pub mod cbor {
#[cfg(test)]
mod tests {
- use std::{env, fs, num::NonZeroUsize, time::Duration};
+ use std::{env, fs, time::Duration};
use super::*;
use akka_persistence_rs::{entity::EventSourcedBehavior, entity_manager};
@@ -606,7 +606,7 @@ mod tests {
use streambed::commit_log::{Header, HeaderKey};
use streambed_logged::FileLog;
use test_log::test;
- use tokio::{sync::mpsc, time};
+ use tokio::time;
// Scaffolding
@@ -831,17 +831,7 @@ mod tests {
Topic::from("some-topic"),
);
- let my_behavior = MyBehavior;
-
- let (_, my_command_receiver) = mpsc::channel(10);
-
- assert!(entity_manager::run(
- my_behavior,
- file_log_topic_adapter,
- my_command_receiver,
- NonZeroUsize::new(1).unwrap(),
- )
- .await
- .is_ok());
+ let (entity_manager, _) = entity_manager::task(MyBehavior, file_log_topic_adapter, 10, 1);
+ assert!(entity_manager.await.is_ok());
}
}
diff --git a/akka-persistence-rs/benches/benches.rs b/akka-persistence-rs/benches/benches.rs
index ce4d972..4728f0a 100644
--- a/akka-persistence-rs/benches/benches.rs
+++ b/akka-persistence-rs/benches/benches.rs
@@ -1,4 +1,4 @@
-use std::{io, num::NonZeroUsize, pin::Pin, sync::Arc};
+use std::{io, pin::Pin, sync::Arc};
use akka_persistence_rs::{
effect::{persist_event, Effect, EffectExt},
@@ -8,7 +8,7 @@ use akka_persistence_rs::{
};
use async_trait::async_trait;
use criterion::{criterion_group, criterion_main, Criterion};
-use tokio::sync::{mpsc, Notify};
+use tokio::sync::Notify;
use tokio_stream::Stream;
const NUM_EVENTS: usize = 10_000;
@@ -81,16 +81,16 @@ fn criterion_benchmark(c: &mut Criterion) {
.unwrap();
let events_processed = Arc::new(Notify::new());
- let (sender, receiver) = mpsc::channel(10);
- let _ = rt.spawn(entity_manager::run(
+ let (task, sender) = entity_manager::task(
Behavior,
Adapter {
event_count: 0,
events_processed: events_processed.clone(),
},
- receiver,
- NonZeroUsize::new(1).unwrap(),
- ));
+ 10,
+ 1,
+ );
+ let _ = rt.spawn(task);
b.to_async(&rt).iter(|| {
let task_events_processed = events_processed.clone();
diff --git a/akka-persistence-rs/src/entity_manager.rs b/akka-persistence-rs/src/entity_manager.rs
index d10ddee..76e1794 100644
--- a/akka-persistence-rs/src/entity_manager.rs
+++ b/akka-persistence-rs/src/entity_manager.rs
@@ -11,10 +11,12 @@ use chrono::Utc;
use log::debug;
use log::warn;
use lru::LruCache;
+use std::future::Future;
use std::hash::BuildHasher;
use std::io;
use std::num::NonZeroUsize;
use std::pin::Pin;
+use tokio::sync::mpsc;
use tokio::sync::mpsc::Receiver;
use tokio_stream::{Stream, StreamExt};
@@ -118,8 +120,10 @@ where
}
}
-/// Manages the lifecycle of entities given a specific behavior.
-/// Entity managers are established given an adapter of persistent events associated
+/// Provides an asynchronous task and a command channel that can run and drive an entity manager.
+///
+/// Entity managers manage the lifecycle of entities given a specific behavior.
+/// They are established given an adapter of persistent events associated
/// with an entity type. That source is consumed by subsequently telling
/// the entity manager to run, generally on its own task. Events are persisted by
/// calling on the adapter's handler.
@@ -127,32 +131,45 @@ where
/// Commands are sent to a channel established for the entity manager.
/// Effects may be produced as a result of performing a command, which may,
/// in turn, perform side effects and yield events.
-pub async fn run(
+///
+/// * `command_capacity` declares size of the command channel and will panic at runtime if zero.
+/// * `entity_capacity` declares size of the number of entities to cache in memory at one time,
+/// and will panic at runtime if zero.
+pub fn task(
behavior: B,
adapter: A,
- receiver: Receiver>,
- capacity: NonZeroUsize,
-) -> io::Result<()>
+ command_capacity: usize,
+ entity_capacity: usize,
+) -> (
+ impl Future