生命周期

本章节介绍 EH Forwarder Bot 示例,以及消息/状态对象的生命周期。

EFB 实例的生命周期

下图概述了一个 EFB 实例的生命周期,以及信道和中间件如何参与其中。

@startuml
start
:用户启动 EFB 实例;
:读取配置档案设定;
:导入启用的组件;
note right
    按照配置档案中指定的顺序导入模块,首先是主端,然
    后是从端和中间件。
end note
:初始化从端;
note right
    按照配置文件配置中指定的顺序进行初始化从端。

    完成后,从端应准备通过方法调用(""get_chats()""、
    ""get_chat_picture()"" 等)来响应所有请求。

    从端准备发送给主端的消息,应保留到调用 ""poll()"" 之后
    再发送。

    请注意,此时主端尚未准备就绪,因此无法通过框架与用
    户进行互动。虽然从端可以通过检查主端的配置文件以进
    行某些特定的交互,但不建议(NOT RECOMMEND)这
    样做。如果有其他解决。在有其他解决方法的情况下,
    应(SHOULD)尽量避免直接对主端操作。
end note
:初始化主端;
note right
    主端此时可以从启用的从端中加载数据,但中间件尚未就
    绪。

    来自主端的消息在调用 ""poll()"" 后发出。
end note
:初始化中间件;
note right
    按照配置文件配置中指定的顺序进行初始化中间件。此时,
    所有的主端和从端均已初始化完毕。

    中间件可以在初始化时检测启用的信道以变更其行为或对
    于信道进行猴子补丁(monkey-patching)。
end note
:开始主端和从端轮询;
note right
    在分别的 Python 线程中调用每个从端的 ""poll()"" 方法。
    信道之间传递的消息应(SHOULD)**仅在此方法被调**
    **用之后**发出。
end note
:用户触发终止指令|
:调用主端和从端的
""stop_polling()"" 方法;
note right
    当调用 ""stop_polling()"" 时,信道应(SHOULD)
    进行适当的善后处理工作,并准备结束进程。

    在善后处理结束后,""poll"" 线程运行的代码必须
    (MUST)停止运行,以保证顺当的「优雅中止」
    (graceful exit)。
end note
:""join"" 所有轮询线程;
note right
    框架会等待所有 ""poll"" 线程终止,以保证完整的「优雅中
    止」状态。
end note
stop
@enduml

EFB 实例的生命周期

消息的生命周期

下图概述了一条消息的生命周期:从发件信道发出,通过所有中间件、发送到收件信道并返回到发件通道。

@startuml
start
:构建消息并通过 ""coordinator.send_message()""
发送到协调器;
while (//for// 每一个中间件) is (do)
    :中间件处理并修改消息;
    if (消息对象是否为 ""None""?) then (是)
        :向发件信道返回 ""None"";
        stop
    endif
end while (完成)
if (消息是否有效?) then (是)
else (否)
    :向发件信道抛出异常;
    end
endif
:传递消息到收件信道;
:返回最终消息给发件信道;
note right
    如果消息是发送到从端的,最终的
    消息对象应当(SHOULD)包含消
    息来自从端的消息 ID。
end note
stop
@enduml

消息的生命周期

状态对象也会以同样方式处理。