我的应用程序将MQTT消息存储到MongoDB中时遇到问题。
我正在使用spring-boot-starter-data-mongodb
,它打开了许多与MongoDB的连接,它引发了异常,告诉我我超过了500个连接限制。而且CPU使用率一直超过95%。
这里是存储到MongoDB中的方法:
@Async
public void insertIntoDb(String topic, String vhost, MqttMessage mqttMessage) {
try {
String[] split = topic.split("/", 2);
String deviceName = split[0];
String topicName = (split.length > 1) ? split[1] : split[0];
Date now = new Date();
Object value = getValue(mqttMessage);
String upsertId = topicRepository.upsertTopic(new Topic(topicName, deviceName, vhost, now.getTime(), value));
boolean updateLastActivity = (topicName.equals("STS") || topicName.equals("LASTACTIVITY")) ? false : true;
deviceRepository.upsertDevice(new Device(deviceName, vhost, now.getTime()), upsertId, updateLastActivity);
if (typeDetectionService.isOctetStream(mqttMessage.getPayload())) {
dataRepository.save(new Data(deviceName, topicName, vhost, new Date(), mqttMessage.getPayload()));
} else {
dataRepository.save(new Data(deviceName, topicName, vhost, new Date(), value));
}
} catch (Exception e) {
logger.error("Error", e);
}
}
它使用insert
界面中的MongoRepository
方法,我知道这不是在MongoDB中插入大量数据的最佳方法,我必须使用Bulk插入。
我遇到的问题是,我需要尽快将数据插入数据库中,因为它必须接近实时(我正在使用IOT设备)。我考虑过将要填充的列表,当列表达到1000个数据(如果我没有看错的话,是对批量的限制...),它将批量插入数据库中。或者,如果列表填充的速度不够快,则超时将告诉您何时写入所有数据。
我考虑过进行Spring集成,但是我不知道是否有适合我需要的MessageChannel
。
如果您有任何建议,我很乐意听到:)