
gu.dtalk.engine.BaseItemEngine Maven / Gradle / Ivy
package gu.dtalk.engine;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.MoreObjects;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import gu.dtalk.Ack;
import gu.dtalk.Ack.Status;
import gu.dtalk.CmdItem;
import gu.dtalk.CommonConstant.ReqCmdType;
import gu.dtalk.CommonUtils;
import gu.dtalk.ICmdInteractiveStatusListener;
import gu.dtalk.BaseItem;
import gu.dtalk.MenuItem;
import gu.dtalk.BaseOption;
import gu.dtalk.ItemType;
import gu.dtalk.RootMenu;
import gu.dtalk.exception.InteractiveCmdStartException;
import gu.simplemq.exceptions.SmqUnsubscribeException;
import gu.simplemq.json.JSONObjectDecorator;
import static com.google.common.base.Preconditions.*;
import static gu.dtalk.CommonConstant.*;
import static gu.dtalk.CommonUtils.*;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 消息驱动的菜单引擎,根据收到的请求执行对应的动作
*
* - OPTION:修改指定的参数
* - CMD:执行指定的命令
* - MENU:输出菜单内容
*
* @author guyadong
*
*/
public abstract class BaseItemEngine implements BaseItemDriver{
protected static final Logger logger = LoggerFactory.getLogger(BaseItemEngine.class);
private MenuItem root = new RootMenu();
private BaseItem currentLevel;
/**
* 当前设备的MAC地址(HEX字符串)
*/
private String selfMac;
/**
* 最近一次操作的时间戳
*/
private long lasthit;
/**
* 当前执行的设备命令
*/
private String cmdLock=null;
private final ScheduledThreadPoolExecutor scheduledExecutor;
private final ScheduledExecutorService timerExecutor;
private ScheduledFuture> future;
/** 定时检查任务,如果超时没有收到进度报告,则视为超时 */
private final Runnable timerTask = new Runnable(){
long progressInternal = TimeUnit.SECONDS.toMillis(getDtalkListener().getProgressInternal());
@Override
public void run() {
// cmdLock 解锁状态下自动中断定时任务
checkState(cmdLock != null);
long lastInternel = System.currentTimeMillis() - getDtalkListener().lastProgress;
if(lastInternel > progressInternal*4){
getDtalkListener().onTimeout();
}
}};
protected static final ThreadLocal reqType = new ThreadLocal();
public BaseItemEngine() {
this.scheduledExecutor =new ScheduledThreadPoolExecutor(1,
new ThreadFactoryBuilder().setNameFormat("cmddog-pool-%d").build());
this.timerExecutor = MoreExecutors.getExitingScheduledExecutorService( scheduledExecutor);
}
/**
* 发送菜单数据
* @param object 菜单实例
*/
protected abstract void responseMenu(MenuItem object);
/**
* 发送ack消息
* @param ack 响应实例
*/
protected abstract void responseAck(Ack
© 2015 - 2025 Weber Informatics LLC | Privacy Policy