如果连续1小时向PostgreSQL插入相同的数据,如何发送电子邮件?

问题描述 投票:0回答:1

我正在使用 Spring Boot 开发后端应用程序,我的应用程序使用 PostgreSQL 作为数据库。传感器数据每秒都会被插入到数据库中。

我想监控数据,如果相同的值连续1小时插入数据库,则发送电子邮件通知。例如:

如果 1 小时内每秒将值 42 插入表中,我想检测到这一点并发送电子邮件。 这是我的主要问题:

我是否应该在 Spring Boot 应用程序中实现此逻辑(例如,使用计划作业来查询和监控数据)? 完全在 PostgreSQL 中处理这个问题是否更好(例如,使用触发器或其他数据库机制)? 每种方法的优缺点是什么,您会推荐哪种方法用于此用例?如果可能的话,我希望获得代码示例或有关如何实现它的指导。

spring postgresql spring-boot mail-server real-time-data
1个回答
0
投票

我可能会做类似的事情:

@Service
public class SensorMonitor {

    @Autowired
    private SensorDataRepository sensorDataRepository;

    
    private Map<String, SensorDataRecord> sensorDataMap;

    @PostConstruct
    public void init() {
        sensorDataMap = new HashMap<>();
        //todo fill map from db from last hour per sensor when service is restarted
    }

    
    public void insertSensorData(String sensorName, int currentValue) {
            String sensorName = data.getSensorName();
            int currentValue = data.getValue();
            LocalDateTime currentTime = LocalDateTime.now();

            sensorDataRepository.save(...);

            SensorData record = sensorDataMap.get(sensorName);
            if (record == null) {
                record = new SensorData(currentValue, currentTime);
                sensorDataMap.put(sensorName, record);
            } else {
                if (record.getValue() == currentValue) {
                    if (record.getTimestamp().plusHours(1).isBefore(currentTime)) {
                        sendNotification(sensorName, currentValue);
                        sensorDataMap.remove(sensorName);
                    }
                } else {
                    record.setValue(currentValue);
                    record.setTimestamp(currentTime);
                }
            }
    }

    private void sendNotification(String sensorName, int value) {
        //send notification
    }

    private static class SensorData {
        private int value;
        private LocalDateTime timestamp;
        ....

    }
}

为了防止太多的数据库请求,我会将这些值保留在内存中。

© www.soinside.com 2019 - 2024. All rights reserved.