关于串行命令队列的设计

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 :多行

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复

    作者信息

    标签TAG

    相关文章