最近做项目需要实现一个功能与终端进行通信下发配置,没得到响应开启定时器再次下发知道收到结果。下面说下我实现的方式
定义一个获取future实例的类
@Service
@Transactional
public class ModemConfigurationService {
protected static ScheduledFuture<?> future;
//从配置文件中获取Cron表达式
@Value("${sendAccessAgainCron}")
private String sendAccessAgainCron;
public static ScheduledFuture<?> getInstance() {
if (future != null) {
return future;
}
return null;
}
//开启定时器
public void startScheduSendParamAgain() {
future = threadPoolTaskScheduler.schedule(new SendModemConfigJobRun(), new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
return new CronTrigger(sendAccessAgainCron).nextExecutionTime(triggerContext);
}
});
}
}
- 定义执行任务的类:
public class SendModemConfigJobRun implements Runnable{
private Logger logger = LoggerFactory.getLogger(SendModemConfigJobRun.class);
//执行自己的业务代码
@Override
public void run() {
try {
String localIp = GetIpAddress.getLocalIP();
callBackImpl = new MediaPluginCallBackImpl();
//加载终端插件
int ccPlugin = MediaPluginlibrary.INSTANTCE.LoadCCPlugin(localIp, callBackImpl);
logger.info("init MediaPluginJobRun ccPluginResult:"+ ccPlugin);
if(ccPlugin >=0) {
//关闭定时器
stopLoadMediaPluginJob();
}
} catch (Exception e) {
e.printStackTrace();
logger.error("Send Save Access Param error", e);
}
}
//停止定时器
public void stopSendParamJob() {
ScheduledFuture<?> future = ModemConfigurationService.getInstance();
if(future != null) {
future.cancel(true);
}
}
}
好了,这样就结束了,端午节快乐!!