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