背景

在Java SpringBoot项目使用org.eclipse.paho.client.mqttv3 依赖开启mqtt客户端后,在项目下面自动生成名为ClientId-tcp123456789内容为.lck文件的文件夹。如下图

在这里插入图片描述

解决方案-如何避免.lck文件

在创建MqttClient对象时指定持久化方式为MemoryPersistent,如果不指定持久化方式,则在MqttClient构造方法中会自动设置成MqttDefaultFilePersistence。

	public MqttClient(String serverURI, String clientId) throws MqttException {
		this(serverURI,clientId, new MqttDefaultFilePersistence());
	}

故,只需要制定持久化方式即可,可以使用null,也可以使用MemoryPersistent。

client = new MqttClient("tcp://ip_of_server:1883", client_id, null);

client = new MqttClient("tcp://ip_of_server:1883", client_id, new MemoryPersistence());

.lck

.lck文件是锁(lock)文件,用于进程间的同步和资源配置,确保多个进程或线程访问相同资源时能够有序访问,在MQTT客户端中,「连接状态」「消息同步处理」「配置文件访问」均会使用到.lck文件作为并发控制。

  • 连接状态:当MQTT客户端尝试建立连接或断开连接时,锁文件可以确保在同一时刻只有一个操作在执行,例如在网络环境较差的情况下,可能会有多个线程尝试建立MQTT连接,导致连接混乱。
  • 消息同步处理:MQTT客户端订阅多主题时,可能会同时收到多主题发来的消息,且每个主题大概率有一个处理方法,且大概率会访问共享资源,如消息缓存或消息计数器。故需要锁文件。
  • 配置文件访问:例如MQTT客户端断开重连时,可能会有多个线程尝试重连。故需要锁文件。

注:.lck文件应该是会自动删除的,但在程序异常退出或意外终止时未正确释放锁,会导致.lck文件的残留。此时手动删除即可。

MemoryPersistence

基于内存的持久性,在java文档中如此描述:

Persistence that uses memory In cases where reliability is not required across client or device restarts memory this memory peristence can be used. In cases where reliability is required like when clean session is set to false then a non-volatile form of persistence should be used.

使用内存的持久性 在不需要在客户端或设备重启时保持可靠性的情况下,可以使用内存持久性。在需要可靠性的情况下,如将清除会话设置为 false,则应使用非易失性形式的持久性。

也就是说,如果cleanSession设置为false不需要清除回话的话,是可以直接使用memoryPersistence的。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐