关于串行命令队列的设计

2022-10-19  本文已影响0人  种一片竹林

1.该队列应该解决了添加和取出处理的锁的问题。LinkedBlockingQueue add poll 

2.关于心跳命令的发送机制

        当其他命令在规定时间里都没有发出和收到情况下才会发出

        该命令的设计应当能保证不会堆积到命令队列中

        该命令应当能控制命令发送的间隔时间

3.关于命令队列普通命令

       应当有快速队列和慢速队列的概念

       应当有处理组合命令的能力

4.关于Loop 逻辑的设计

        当遇到需要定时轮询的命令(进度问询),不应当开启计时器,应当在命令队列中解决,根据业务type码  和 上一次这个命令的发送时间 来决定当下时间点需要不需要发此命令.

        所以当有轮询业务时 需要在 loop 中补全业务逻辑。

5.连接断开

     状态恢复成init ,业务根据需要设定对应的逻辑(一般 clear)。命令队列对应逻辑设计。

代码如何高内聚低耦合

处理接口:

public interface IO {

    void handleCommand(TCommand command) throws IOException;

}

处理命令:

public interface TAction {//命令集合 可以执行多个command

    void exec(IO io) throws IOException;

    void reset();

}

public abstract class TCommand implements TAction {//每一个命令的基类

    public long lastCommand = System.currentTimeMillis();

    public long runTime = 0L; // cmd 下发时间

    public static final String defaultRes = "                              "; // 返回值截取长度(32)

    public TCommand() {

    }

    public abstract void exec(IO io);

    public abstract String encodeCommand();

    public boolean needRes() {

        runTime = System.currentTimeMillis();

        return true;

    }

    public boolean isEndWith() {

        return false;

    }

    public byte[] getRes() {

        return defaultRes.getBytes();

   }

    public void decodeData(String b) {

   }

}

处理

loop{

action = fastQueue.poll(30, TimeUnit.MILLISECONDS);

if (action != null) {

          action.exec(this);

} else {

    SystemClock.sleep(10); // 命令时间间隔

}

doCheckLoop(this)

}

doCheckLoop(IO io){

//根据当前的业务状态 和 检查的命令上次的执行成功时间来决定要不要下检查的命令 不需要直接return

//可以写对应的 业务manager 去管理自己的业务

switch(当前业务的码){

}

协议的格式:

out :16字节的byte

in :多行

上一篇 下一篇

猜你喜欢

热点阅读