1pub mod event_bus;
21pub mod extension_manager;
22pub mod state_actor;
23pub mod system;
24pub mod transaction_processor;
25
26pub use transaction_processor::{TransactionProcessorActor, TransactionMessage};
28pub use state_actor::{StateActor, StateMessage};
29pub use event_bus::{EventBusActor, EventBusMessage};
30pub use extension_manager::{ExtensionManagerActor, ExtensionMessage};
31pub use system::{ForgeActorSystem, ActorSystemConfig};
32
33use ractor::{SpawnErr};
34use std::sync::Arc;
35use thiserror::Error;
36use tokio::sync::oneshot;
37
38#[derive(Debug, Error)]
40pub enum ActorSystemError {
41 #[error("Actor启动失败: {actor_name} - {source}")]
42 ActorStartupFailed { actor_name: String, source: SpawnErr },
43
44 #[error("Actor通信失败: {message}")]
45 CommunicationFailed { message: String },
46
47 #[error("Actor系统关闭失败: {message}")]
48 ShutdownFailed { message: String },
49
50 #[error("配置错误: {message}")]
51 ConfigurationError { message: String },
52
53 #[error("超时错误: {operation}")]
54 TimeoutError { operation: String },
55
56 #[error("其他错误: {message}")]
57 Other { message: String },
58}
59
60pub type ActorSystemResult<T> = Result<T, ActorSystemError>;
62
63#[derive(Debug)]
67pub struct MessageWrapper<T> {
68 pub inner: T,
69 pub reply_to: Option<oneshot::Sender<crate::ForgeResult<()>>>,
70}
71
72impl<T> MessageWrapper<T> {
73 pub fn new(inner: T) -> Self {
74 Self { inner, reply_to: None }
75 }
76
77 pub fn with_reply(
78 inner: T,
79 reply_to: oneshot::Sender<crate::ForgeResult<()>>,
80 ) -> Self {
81 Self { inner, reply_to: Some(reply_to) }
82 }
83
84 pub fn reply(
85 self,
86 result: crate::ForgeResult<()>,
87 ) {
88 if let Some(sender) = self.reply_to {
89 let _ = sender.send(result);
90 }
91 }
92}
93
94#[async_trait::async_trait]
101pub trait ActorManager {
102 type Config;
103 type Handle;
104
105 async fn start(config: Self::Config) -> ActorSystemResult<Self::Handle>;
107
108 async fn stop(handle: Self::Handle) -> ActorSystemResult<()>;
110
111 async fn health_check(handle: &Self::Handle) -> bool;
113}
114
115pub struct ActorMetrics {
117 pub messages_processed: Arc<std::sync::atomic::AtomicU64>,
119 pub errors_count: Arc<std::sync::atomic::AtomicU64>,
121 pub avg_processing_time: Arc<std::sync::atomic::AtomicU64>,
123}
124
125impl Default for ActorMetrics {
126 fn default() -> Self {
127 Self {
128 messages_processed: Arc::new(std::sync::atomic::AtomicU64::new(0)),
129 errors_count: Arc::new(std::sync::atomic::AtomicU64::new(0)),
130 avg_processing_time: Arc::new(std::sync::atomic::AtomicU64::new(0)),
131 }
132 }
133}
134
135impl ActorMetrics {
136 pub fn increment_messages(&self) {
137 self.messages_processed
138 .fetch_add(1, std::sync::atomic::Ordering::Relaxed);
139 }
140
141 pub fn increment_errors(&self) {
142 self.errors_count.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
143 }
144
145 pub fn update_processing_time(
146 &self,
147 duration_ms: u64,
148 ) {
149 self.avg_processing_time
150 .store(duration_ms, std::sync::atomic::Ordering::Relaxed);
151 }
152}