试了很多方法都不能在messageArrived方法里面调用接口,暂时只找到了这一个解决方法
@Component
public class MqttConsumerCallBack implements MqttCallback {
public static MqttConsumerCallBack PushCallback;
@Autowired
private EquipmentService equipmentService;
/**
* 客户端断开连接的回调
*/
@Override
public void connectionLost(Throwable throwable) {
System.out.println("与服务器断开连接,可重连");
}
@PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
public void init() {
System.out.println("初始化");
PushCallback = this;
PushCallback.equipmentService = this.equipmentService;
}
/**
* 消息到达的回调
*/
@Override
public void messageArrived(String topic, MqttMessage message) {
//topic地址转换成eui编号
String[] parts = topic.split("[/:]");
StringBuilder euiBuilder = new StringBuilder();
for (String part : parts) {
if (!part.isEmpty()) {
euiBuilder.append(part.toUpperCase());
}
}
try {
//解析message对象到Equipment
Equipment equipment = JSON.parseObject(message.getPayload(), Equipment.class);
if ("1".equals(equipment.getDevicename())) {
euiBuilder.append("_1");
} else {
euiBuilder.append("_2");
}
String eui = euiBuilder.toString();
equipment.setEui(eui);
//将数据保存到数据库
PushCallback.equipmentService.saveEquipment(equipment);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(String.format("接收消息主题 : %s", topic));
System.out.println(String.format("接收消息Qos : %d", message.getQos()));
System.out.println(String.format("接收消息内容 : %s", new String(message.getPayload())));
System.out.println(String.format("接收消息retained : %b", message.isRetained()));
}
/**
* 消息发布成功的回调
*/
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println(String.format("接收消息成功"));
}
}
主要代码