package com.zy.acs.manager.core.service; import com.alibaba.fastjson.JSON; import com.zy.acs.framework.common.SnowflakeIdWorker; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.domain.AgvAction; import com.zy.acs.common.domain.AgvCommand; import com.zy.acs.common.domain.AgvProtocol; import com.zy.acs.common.domain.BaseResult; import com.zy.acs.common.domain.protocol.AGV_01_UP; import com.zy.acs.common.domain.protocol.AGV_02_UP; import com.zy.acs.common.domain.protocol.IMessageBody; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.common.utils.RequestSupport; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.concurrent.TimeoutException; /** * Created by vincent on 2023/3/22 */ @Slf4j @Service public class AgvCmdService { private final RedisSupport redis = RedisSupport.defaultRedisSupport; @Autowired private SnowflakeIdWorker snowflakeIdWorker; public BaseResult executeAgvActionCmd(AgvAction agvAction) { // todo 1: 记录日志 2:发送任务 3:同步响应 log.info(JSON.toJSONString(agvAction)); String serialNo = agvAction.getSerialNo(); AgvProtocol protocol = AgvProtocol.build(agvAction.getAgvNo()).setMessageBody(agvAction.beMesBody(serialNo)); return this.requestProcess(serialNo, protocol , (RequestSupport) result -> result.getSerialNo().equals(serialNo)); } public BaseResult executeAgvCommand(AgvCommand agvCommand) { // todo 1: 记录日志 2:发送任务 3:同步响应 log.info(JSON.toJSONString(agvCommand)); String serialNo = agvCommand.getSerialNo(); AgvProtocol protocol = AgvProtocol.build(agvCommand.getAgvNo()).setMessageBody(agvCommand.beMesBody(serialNo)); return this.requestProcess(serialNo, protocol , (RequestSupport) result -> result.getSerialNo().equals(serialNo)); } @SuppressWarnings("all") private BaseResult requestProcess(String serialNo, AgvProtocol protocol, RequestSupport support){ try { IMessageBody messageBody = executeRequest(serialNo, protocol); if(support.success((T) messageBody)) { return BaseResult.ok(); } else { return BaseResult.error(); } } catch (TimeoutException ex){ return BaseResult.error(); } } @SuppressWarnings("all") private IMessageBody executeRequest(String serialNo, AgvProtocol protocol) throws TimeoutException { redis.push(RedisConstant.AGV_CMD_DOWN_FLAG, protocol); IMessageBody messageBody = null; String redisKey = protocol.getAgvNo() + "_" + serialNo; // 获取响应 long startTime = System.currentTimeMillis(); while ((System.currentTimeMillis() - startTime) < RedisConstant.CMD_TIMEOUT_LIMIT) { if ((messageBody = redis.getObject(RedisConstant.AGV_CMD_UP_FLAG, redisKey)) != null){ redis.deleteObject(RedisConstant.AGV_CMD_UP_FLAG, redisKey); return messageBody; } try{ Thread.sleep(100); }catch(Exception ex){ ex.printStackTrace(); } } throw new TimeoutException(); } }