跳至主要內容

请求消息处理器

hylexus约 404 字大约 1 分钟

请求消息处理器

介绍

提示

接收/处理 请求没有强制指定固定类型的处理器,由谁来处理消息取决于 Jt808HandlerMapping 配置。

内置了两个 Jt808HandlerMapping:

  • SimpleJt808RequestHandlerHandlerMapping 能将消息路由到 SimpleJt808RequestHandler 类型的 类级别 处理器。
  • Jt808RequestHandlerMappingHandlerMapping 能将消息路由到 @Jt808RequestHandlerMapping 注解修饰的 方法级别 处理器。

@Jt808RequestHandlerMapping

介绍

@Jt808RequestHandlerMapping 标记的这种处理器也是从 Spring 借鉴(抄袭)的。和 Spring@Controller@RestController 用法类似。

作用就是标记一下当前类是一个消息处理器类。被该注解标记的类中应该存在若干个能处理请求的方法。

示例

@Slf4j
@Component
// @Jt808RequestHandler 标记该类 表示该类是一个消息处理器累(具体的处理器是该类中的部分方法)
@Jt808RequestHandler
public class SomeRequestHandler {

    @Jt808RequestHandlerMapping(msgType = 0x0100, versions = VERSION_2013)
    public TerminalRegisterReplyMsg processTerminalRegisterMsgV2011(Jt808Request request, TerminalRegisterMsgV2011 body) {

        processRequest(request, body);
        return ...;
    }

    @Jt808RequestHandlerMapping(msgType = 0x0100, versions = VERSION_2019)
    public TerminalRegisterReplyMsg processTerminalRegisterMsgV2019(Jt808RequestEntity<TerminalRegisterMsgV2019> request) {

        processRequest(request, body);
        return ...;
    }

}


 
 

















SimpleJt808RequestHandler

介绍

最直观的处理方式就是类似于 SpringWebFlux 中的 org.springframework.web.reactive.function.server.HandlerFunction

但是 HandlerFunction 需要借助 RouterFunction 来将请求和 HandlerFunction 联系起来。

本项目借鉴(抄袭) WebFlux,提供了一个 SimpleJt808RequestHandler(为了编码简单,直接省去了 RouterFunction) :

SimpleJt808RequestHandler:active
public interface SimpleJt808RequestHandler<T> extends MultipleVersionSupport {

    /**
     * @return 该处理器可以处理什么类型的消息
     */
    Set<MsgType> getSupportedMsgTypes();

    /**
     * @return 该处理器可以处理的协议类型(默认为ALL)
     */
    @Override
    default Set<Jt808ProtocolVersion> getSupportedVersions() {
        return MultipleVersionSupport.super.getSupportedVersions();
    }

    /**
     * 处理消息
     *
     * @return {@link Jt808Response} 或 可以转换为 {@link Jt808Response} 的类型
     */
    T handleMsg(Jt808ServerExchange exchange);

}

示例

使用方式

直接将实现了 SimpleJt808RequestHandler 接口的处理器类加入到 Spring 容器中就可以。

@Slf4j
@Component
public class TerminalRegisterMsgHandlerV2011 implements SimpleJt808RequestHandler<BuiltinMsg8100> {

    /**
     * 处理 [终端注册] 消息
     */
    @Override
    public Set<MsgType> getSupportedMsgTypes() {
        return Set.of(BuiltinJt808MsgType.CLIENT_REGISTER);
    }

    /**
     * 处理 [V2011] 版的消息
     */
    @Override
    public Set<Jt808ProtocolVersion> getSupportedVersions() {
        return Jt808ProtocolVersion.unmodifiableSetVersion2011();
    }

    // 7E01000023013912344321007B000B0002696431323361626364656667684944313233343501B8CA4A2D313233343531317E
    @Override
    public BuiltinMsg8100 handleMsg(Jt808ServerExchange exchange) {

        processRequest(exchange);

        return ...
    }
}