client.publish(topic, message)导致线程卡住
原因:有一个mqtt客户端处理业务代码,由于数据毕竟频繁,所以使用了线程池,如下
private final static ExecutorService executorService = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(),
Runtime.getRuntime().availableProcessors() * 2, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(50000));
通过submit()执行业务代码,当受到网络波动时(即一段时间没有网络,后续又有网络,mqtt客户端进行重连),mqtt客户端client.publish(topic, message);推送没有反馈,线程卡住,导致线程池进行中线程一直不能被释放
解决方案
使用
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
// 进行消息发送
client.publish(topic, message)
}
});
// 异步执行
xecutorService.execute(future);
try {
// 获取反馈
future.get(2000,TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
// e.printStackTrace();
// 线程超时,取消当前线程的执行
future.cancel(true);
}