Skip to content

Commit

Permalink
add event listens on delete and create method for updating topicList
Browse files Browse the repository at this point in the history
  • Loading branch information
XD-cods committed May 23, 2024
1 parent 0d8d0fe commit 1f63e01
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 46 deletions.
21 changes: 6 additions & 15 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,10 @@
<mongodb-driver-sync.version>4.11.1</mongodb-driver-sync.version>
<jackson-databind.version>2.16.1</jackson-databind.version>
<log4j-core.version>2.17.2</log4j-core.version>
<junit-jupiter-api.version>5.10.2</junit-jupiter-api.version>
<cache2k-base-bom.version>1.6.0.Final</cache2k-base-bom.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>com.github.pengrad</groupId>
<artifactId>java-telegram-bot-api</artifactId>
Expand All @@ -51,15 +43,15 @@
<version>${jackson-databind.version}</version>
</dependency>
<dependency>
<groupId>org.junit-pioneer</groupId>
<artifactId>junit-pioneer</artifactId>
<version>2.2.0</version>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit-jupiter-api.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.cache2k</groupId>
<artifactId>cache2k-base-bom</artifactId>
<version>1.6.0.Final</version>
<version>${cache2k-base-bom.version}</version>
<type>pom</type>
</dependency>
<dependency>
Expand All @@ -70,7 +62,6 @@
</dependencies>
<build>
<plugins>

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.7.1</version>
Expand Down
62 changes: 31 additions & 31 deletions src/main/java/org/example/configs/MongoDBConfig.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
package org.example.configs;


import com.mongodb.ConnectionString;
import com.mongodb.client.ChangeStreamIterable;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.model.changestream.FullDocument;
import com.mongodb.client.model.changestream.OperationType;
import org.example.model.QuizQuestions;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Aggregates;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.example.services.QuizService;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
import org.springframework.data.mongodb.core.ChangeStreamOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.messaging.ChangeStreamRequest;
import org.springframework.data.mongodb.core.messaging.DefaultMessageListenerContainer;
import org.springframework.data.mongodb.core.messaging.Subscription;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import java.util.Arrays;
import java.util.List;

@Configuration
@ComponentScan(basePackages = "org.example")
@PropertySource("classpath:application.properties")
Expand All @@ -50,29 +50,29 @@ public MongoClient mongoClient() {
return MongoClients.create(new ConnectionString(connectionUri));
}

public MongoClient reconnectToDB() {
MongoClient currentClient = mongoClient();
currentClient.close();
return MongoClients.create(new ConnectionString(connectionUri));
}

@Bean
public DefaultMessageListenerContainer messageListenerContainer(MongoTemplate mongoTemplate, QuizService quizService) {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(mongoTemplate);
container.start();
ChangeStreamOptions changeStreamOptions = ChangeStreamOptions.builder()
.filter(Aggregation.newAggregation(Aggregation.match(Criteria.where("operationType").is(OperationType.INSERT.getValue()))))
.fullDocumentLookup(FullDocument.UPDATE_LOOKUP)
.build();
ChangeStreamRequest.ChangeStreamRequestOptions options = new ChangeStreamRequest.ChangeStreamRequestOptions(databaseName, "quizQuestions", changeStreamOptions);
public ChangeStreamIterable<Document> runEventListener(MongoTemplate mongoTemplate, QuizService quizService) {
MongoCollection<Document> collection = mongoTemplate.getCollection("quizQuestions");
List<Bson> pipeline = List.of(
Aggregates.match(Filters.in("operationType", Arrays.asList("insert", "delete"))));
ChangeStreamIterable<Document> changeStream = collection.watch(pipeline);
changeStream.forEach(event -> {
String operationType = event.getOperationTypeString();
if (operationType == null) {
return;
}

Subscription subscription = container.register(new ChangeStreamRequest<>(message -> {
QuizQuestions quizQuestions = message.getBody();
if (quizQuestions != null) {
String topic = quizQuestions.getTopicName();
quizService.addTopic(topic);
switch (operationType) {
case "insert" -> {
Document document = event.getFullDocument();
if (document != null && document.containsKey("topicName")) {
quizService.addTopic(document.getString("topicName"));
}
}
case "delete" -> quizService.updateTopics();
}
}, options), QuizQuestions.class);
return container;

});
return changeStream;
}
}
4 changes: 4 additions & 0 deletions src/main/java/org/example/services/QuizService.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,8 @@ public QuizQuestions findRandomQuestionsByTopicName(String topicName, int count)
return quizRepo.findRandomQuestionsByTopicName(topicName, count);
}

public void updateTopics(){
List<String> topics = Arrays.stream(quizRepo.findAllTopic().split(",")).toList();
topicsCache.put("topics", topics);
}
}

0 comments on commit 1f63e01

Please sign in to comment.