如何将MQTT消息的负载存储到MongoDB中?

时间:2018-12-03 14:56:36

标签: java spring mongodb spring-data

我的应用程序将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

如果您有任何建议,我很乐意听到:)

0 个答案:

没有答案