• 模型和定制
    • Model Trait
    • 默认模型
    • 自定义模型

    模型和定制

    Riker需要Model来设置整个系统中使用的消息类型,并指定提供核心服务的模块。 Model是一个可以在Rust类型上实现的特性,然后用于创建ActorSystem。

    Model Trait

    让我们来看看Model特征:

    1. pub trait Model : Sized {
    2. /// The message type used throughout the system.
    3. /// `Actor.receive` expects this type
    4. type Msg: Message;
    5. /// Dispatcher executes actors and futures
    6. type Dis: Dispatcher;
    7. /// Logger provides global logging, e.g. info!("hello");
    8. type Log: LoggerProps<Msg = Self::Msg>;
    9. /// Dead letters subscribes to the dead letters channel
    10. type Ded: DeadLetterProps<Msg = Self::Msg>;
    11. /// Timer provides message scheduling, e.g. `ctx.schedule_once`
    12. type Tmr: TimerFactory<Msg = Self::Msg>;
    13. /// Event store provides the storage system for events/messages
    14. type Evs: EventStore<Msg=Self::Msg>;
    15. type Tcp: IoManagerProps<Msg = Self::Msg>;
    16. type Udp: IoManagerProps<Msg = Self::Msg>;
    17. }

    模型特征由用于定制Riker系统的各种特征类型组成,包括消息类型。

    默认模型

    riker-default crate提供了一个默认模型,它使用默认的Riker模块,但仍允许您指定消息类型(协议)。

    使用默认模型:

    1. extern crate riker;
    2. extern crate riker_default;
    3. use riker::actors::*;
    4. use riker_default::DefaultModel;
    5. // Get a default model with String as the message type
    6. let model: DefaultModel<String> = DefaultModel::new();
    7. let sys = ActorSystem::new(&model).unwrap();

    默认模型有助于启动应用程序的初始阶段。 它也是集成测试的不错选择。 当您准备好使用其他模块时,例如特定数据库的事件存储模块,您可以使用自己的模型。

    自定义模型

    由于Model是一个特征,它可以在一个简单的结构上实现。

    让我们看看如何创建模型来更改事件存储和日志记录模块:

    1. extern crate riker;
    2. extern crate riker_default;
    3. use riker::actors::*;
    4. use riker_default::*; // <-- we're still going to use some default modules
    5. struct MyModel;
    6. impl Model for MyModel {
    7. type Msg = String;
    8. type Dis = ThreadPoolDispatcher;
    9. type Ded = DeadLettersActor<Self::Msg>;
    10. type Tmr = BasicTimer<Self::Msg>;
    11. type Evs = Redis<Self::Msg>; // <-- a module to provide Redis storage
    12. type Tcp = TcpManager<Self::Msg>;
    13. type Udp = TcpManager<Self::Msg>;
    14. type Log = MyLogger<Self::Msg>; // <-- our own Log module
    15. }
    16. let sys = ActorSystem::new(&MyModel).unwrap();