Итак, мне удалось создать очень простой поток изменений 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, чтобы начать просмотр коллекции. Как мне это сделать?
@dangarfield Я понимаю, но весь метод changeStream должен быть вызван до вызова .watch(), или я здесь совершенно не прав? Это не мой основной класс, поэтому я не вижу, когда вызывается метод changeStream?
Разве это не и проблема, и решение? Я добавлю потенциальное решение для весенней загрузки




Если я правильно понимаю, вы можете просто добавить класс @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
Надеюсь, это просто так. Если нет, то если бы вы могли описать точный процесс запуска и детали вашего приложения с весенней загрузкой, это помогло бы.
Это именно то, что я искал, и это работает. Большое спасибо!!!
Это должно быть запущено уже тогда, когда вы вызываете
.watch(). Вы не видите никаких результатов? Не могли бы вы попробовать без фильтров или опций и отладить оттуда? напримерcollection.watch().forEach((Consumer<ChangeStreamDocument<Document>>) System.out::println);