Как мне запустить поток изменений MongoDB в Spring Boot?

Итак, мне удалось создать очень простой поток изменений MongoDB в моем приложении Spring Boot:

public class MongoDBChangeStream {

    public void changeStream() {

        // connect to the local database server
        MongoClient mongoClient = MongoClients.create("db uri goes here");

        // Select the MongoDB database
        MongoDatabase database = mongoClient.getDatabase("MyDatabase");

        // Select the collection to query
        MongoCollection<Document> collection = database.getCollection("teams");

        // Create pipeline for operationType filter
        List<Bson> pipeline = Arrays.asList(
                Aggregates.match(
                        Filters.in(
                                "operationType",
                                Arrays.asList("insert", "update", "delete")
                        )));

        // Create the Change Stream
        ChangeStreamIterable<Document> changeStream = collection.watch(pipeline)
                .fullDocument(FullDocument.UPDATE_LOOKUP);

        // Iterate over the Change Stream
        for (ChangeStreamDocument<Document> changeEvent : changeStream) {
            // Process the change event here
            switch (changeEvent.getOperationType()) {
                case INSERT:
                    System.out.println("MongoDB Change Stream detected an insert");
                    break;
                case UPDATE:
                    System.out.println("MongoDB Change Stream detected an update");
                    break;
                case DELETE:
                    System.out.println("MongoDB Change Stream detected a delete");
                    break;
            }
        }
    }
}

Как видите, я прослушиваю вставки, обновления и удаления в коллекции «команды», а затем просто распечатываю соответствующее сообщение в консоли.

Но как мне на самом деле запустить прослушиватель? Когда я запускаю приложение, что-то должно запустить changeStream, чтобы начать просмотр коллекции. Как мне это сделать?

Это должно быть запущено уже тогда, когда вы вызываете .watch(). Вы не видите никаких результатов? Не могли бы вы попробовать без фильтров или опций и отладить оттуда? например collection.watch().forEach((Consumer<ChangeStreamDocument<Do‌​cument>>) System.out::println);

dangarfield 07.12.2022 14:59

@dangarfield Я понимаю, но весь метод changeStream должен быть вызван до вызова .watch(), или я здесь совершенно не прав? Это не мой основной класс, поэтому я не вижу, когда вызывается метод changeStream?

Ben 07.12.2022 15:10

Разве это не и проблема, и решение? Я добавлю потенциальное решение для весенней загрузки

dangarfield 07.12.2022 15:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю, вы можете просто добавить класс @Configuration с методом @PostConstruct:

@Configuration
public class DatabaseChangeStreamInitialiser {

    @PostConstruct
    public void init() {
      // eg, call `MongoDBChangeStream.changeStream`
    }
}

или

@Component
public class DatabaseChangeStreamInitialiser {

    @EventListener(ContextRefreshedEvent.class)
    public void init() {
      // eg, call `MongoDBChangeStream.changeStream`
    }
}

Есть много способов сделать это, вы можете @EventListener аннотации слушать ContextRefreshedEvent. Создайте InitializingBeans или даже просто найдите метод main в своем классе, аннотированный @SpringBootApplication.

Некоторые другие параметры описаны здесь: Метод выполнения при запуске в Spring

Надеюсь, это просто так. Если нет, то если бы вы могли описать точный процесс запуска и детали вашего приложения с весенней загрузкой, это помогло бы.

Это именно то, что я искал, и это работает. Большое спасибо!!!

Ben 07.12.2022 15:38

Другие вопросы по теме