关于串行命令队列的设计
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 :多行