Simple Robot v4.6.0 Help

拦截器 Interceptor

在构建 Application 的过程中,可以通过 eventDispatcher 作用域来配置事件调度器, 而在其中可以为整个调度器增加拦截器。

拦截器分为两种,一个是 全局拦截器 (EventDispatchInterceptor ),一个是 局部拦截器 (EventInterceptor), 它们的区别在于它们生效的范围。

种类

范围

全局拦截器

整个事件调度的过程,其中可能包含多个事件处理器(以及它们可能包含的多个 局部拦截器)。

局部拦截器

每一个事件处理器的处理流程。

全局拦截器

放行:

val app = launchSimpleApplication { eventDispatcher { // 添加一个全局拦截器 addDispatchInterceptor { // 放行、或进入下一个拦截 invoke() } } }

拦截并返回自定义结果:

val app = launchSimpleApplication { eventDispatcher { addDispatchInterceptor { // 这里直接返回了自定义的 `Flow<EventResult` 而没有执行 `invoke`, // 因此实际上没有任何事件处理器被执行, // 也就是被"拦截"了。 flowOf(EventResult.empty(), EventResult.empty()) } } }

局部拦截器

放行:

val app: Application = ... app.listeners { process<Event>(propertiesConsumer = { // 通过 propertiesConsumer 配置事件处理器的属性, // 这其中可以通过 addInterceptor 添加针对当前事件处理器的局部拦截器。 addInterceptor { // 放行、或进入下一个拦截 invoke() } }) { event -> println("Event: $event") } }

拦截并返回自定义结果:

val app: Application = ... app.listeners { process<Event>(propertiesConsumer = { // 通过 propertiesConsumer 配置事件处理器的属性, // 这其中可以通过 addInterceptor 添加针对当前事件处理器的局部拦截器。 addInterceptor { // 这里直接返回了自定义的 `EventResult` 而没有执行 `invoke`, // 因此实际上事件处理器没有被执行, // 也就是被"拦截"了。 EventResult.empty() } }) { event -> println("Event: $event") } }

Quantcat (注解API) 支持

Quantcat API 中定义了与拦截器相关的注解: @Interceptor, 因此在支持 Quantcat API 的地方 (比如 Spring Boot 中) 也支持使用注解来注册拦截器。

在 Quantcat API 中内置了一个很常用的注解 @ContentTrim, 它便是基于 @Interceptor 的一个衍生注解, 可以用于对标记的监听函数 (标记了 @Listener 的函数) 添加一个局部拦截器

TODO

Last modified: 19 September 2024