java 使用ScheduledExecutorService实现定时轮询,包含超时时间

  首先使用这个是为了MQTT发布的时候同步订阅响应的主题返回相应的信息,mqtt不能同步返回消息就是麻烦。方案就是:

1. MQTT发布topic

2. 每隔0.1秒进行轮询,查询redis缓存的数据

3. MQTT订阅后把返回信息放在redis缓存

4. 查询redis缓存有数据,退出轮询


String devNum ="dev001";
		ScheduledExecutorService service = Executors.newScheduledThreadPool(8);
		final Map<String, Future> futures = new HashMap<>();
		// 每隔0.1秒进行轮询
		final ScheduledFuture<?> future = service.scheduleWithFixedDelay(new Runnable() {
			@Override
			public void run() {
				String task = redisCache.getString(taskId);
				if (task != null && task.length() != 0) {
					Future future = futures.get(devNum);
					if (future != null) {
						futures.remove(devNum);
						future.cancel(true);
						service.shutdown();
					}
				}
			}
		}, 0, 100, TimeUnit.MILLISECONDS);
		try {
			futures.put(devNum, future);
			// 设置超时时间
			future.get(4, TimeUnit.SECONDS);
		} catch (InterruptedException e2) {
			e2.printStackTrace();
			log.error(e2.getMessage());
		} catch (CancellationException e2) {
			log.info(e2.getMessage());
		} catch (ExecutionException e2) {
			e2.printStackTrace();
			log.error(e2.getMessage());
		} catch (TimeoutException e2) {
			log.info(e2.getMessage());
		} finally {
			future.cancel(true);
			service.shutdownNow();
		}

新手 , 有什么好建议吗


猜你喜欢

转载自blog.csdn.net/weixin_42215988/article/details/80928767