Как заставить контроллер Spring json ждать, пока не закончится запрос firebase? - PullRequest
0 голосов
/ 02 августа 2020

Я использую ajax вызов контроллера Spring, чтобы запустить запрос firebase, сохранить результат в локальную базу данных и вернуть элементы, сохраненные в локальной базе данных (включая результаты, сохраненные из текущего и предыдущего запросов firebase). Проблема в том, что, поскольку запрос firebase выполняется asyn c, результаты запроса локальной базы данных возвращаются до завершения запроса firebase. Как я могу заставить возвращенный запрос локальной базы данных ждать, пока не завершится запрос firebase?

    @PostMapping("/firebase-download")
    @ResponseBody
    public List<FirebaseTransactionRecord> firebaseDownload() {
        
        firebaseService.downloadAndSaveFirebaseTransactions();
        // wait for the query to end
        return firebaseTransactionRecordRepository.findBySentFalse();
    }   
    @Override
    @Transactional
    public void downloadAndSaveFirebaseTransactions() {

            final List<FirebaseTransactionRecord> firebaseTransactions = new ArrayList<>();

            firebaseDb.child(StringValueConstant.DB_CHILD_TEMPORARY_TRANSACTIONS)
                    .addValueEventListener(new ValueEventListener() {

                        @Override
                        public void onDataChange(DataSnapshot snapshot) {

                            for (DataSnapshot userSnapshot : snapshot.getChildren()) {
                                userSnapshot.getChildren().forEach(transactionSnapshot -> {
                                    FirebaseTransactionRecord record = firebaseTransactionMapper
                                            .toFirebaseTransactionRecord(transactionSnapshot);
                                    firebaseTransactions.add(record);
                                });
                            }

                            saveFirebaseTransactionRecords(firebaseTransactions);
                        }

                        @Override
                        public void onCancelled(DatabaseError error) {
                            log.error("Error reading Firebase data:", error);
                        }
                    });
    }
    @Override
    @Transactional
    public void saveFirebaseTransactionRecords(List<FirebaseTransactionRecord> firebaseTransactions) {
        firebaseTransactions.forEach(firebaseTransaction -> {
            if (!firebaseTransactionRecordRepository.existsByReferralNumber(firebaseTransaction.getReferralNumber())) {
                firebaseTransactionRecordRepository.save(firebaseTransaction);
            }
        });     
    }   

1 Ответ

1 голос
/ 03 августа 2020

Что-то с CountdownLatch должно сработать.

Установите начальный счетчик защелок на 1 (для основного слушателя), затем установите его на количество дочерних узлов в onDataChange. Затем передайте защелку на saveFirebaseTransactionRecords и уменьшайте ее по завершении каждой транзакции. Как только защелка достигнет 0, вы сможете выйти из downloadAndSaveFirebaseTransactions

...