Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/producer/target/
/.idea/yatool.xml
.idea/
/worker/target/
/aggregator/target/
/producer/src/main/resources/sample-text.txt
/aggregator/results/
/producer/src/main/resources/big.txt
8 changes: 0 additions & 8 deletions .idea/.gitignore

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/compiler.xml

This file was deleted.

15 changes: 0 additions & 15 deletions .idea/gradle.xml

This file was deleted.

20 changes: 0 additions & 20 deletions .idea/jarRepositories.xml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/kotlinc.xml

This file was deleted.

10 changes: 0 additions & 10 deletions .idea/misc.xml

This file was deleted.

9 changes: 0 additions & 9 deletions .idea/modules.xml

This file was deleted.

8 changes: 0 additions & 8 deletions .idea/modules/lab_3.main.iml

This file was deleted.

8 changes: 0 additions & 8 deletions .idea/modules/lab_3.test.iml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/QODoQuhO)
# Распределенная обработка текстовых данных с использованием брокера сообщений

## Цель задания:
Expand Down
87 changes: 87 additions & 0 deletions aggregator/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>ru.ifmo</groupId>
<artifactId>aggregator</artifactId>
<version>1.0</version>
<packaging>jar</packaging>

<name>Aggregator</name>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.12</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>ru.ifmo.App</start-class>
<java.version>21</java.version>
<lombok.version>1.18.30</lombok.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
</jvmArguments>
</configuration>
<!-- <dependencies>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework</groupId>-->
<!-- <artifactId>springloaded</artifactId>-->
<!-- <version>3.4.12</version>-->
<!-- </dependency>-->
<!-- </dependencies>-->
</plugin>
</plugins>
</build>
</project>
11 changes: 11 additions & 0 deletions aggregator/src/main/java/ru/ifmo/App.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.ifmo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
16 changes: 16 additions & 0 deletions aggregator/src/main/java/ru/ifmo/AppConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.ifmo;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
return mapper;
}
}
84 changes: 84 additions & 0 deletions aggregator/src/main/java/ru/ifmo/configuration/RabbitConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package ru.ifmo.configuration;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

public Jackson2JsonMessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(messageConverter());
return template;
}

@Bean
public DirectExchange resultsExchange(
@Value("${rabbitmq.results.exchange.name}") String exchangeName
) {
return new DirectExchange(exchangeName);
}

@Bean
public Queue resultsQueue(
@Value("${rabbitmq.results.queue.name}") String queueName
) {
return new Queue(queueName);
}

@Bean
public DirectExchange sessionInfoExchange(
@Value("${rabbitmq.session.exchange.name}") String exchangeName
) {
return new DirectExchange(exchangeName);
}

@Bean
public Queue sessionInfoQueue(
@Value("${rabbitmq.session.queue.name}") String queueName
) {
return new Queue(queueName);
}

@Bean
public Binding sessionInfoBinding(
Queue sessionInfoQueue,
DirectExchange sessionInfoExchange,
@Value("${rabbitmq.session.routing.key}") String routingKey
) {
return BindingBuilder.bind(sessionInfoQueue).to(sessionInfoExchange).with(routingKey);
}

@Bean
public DirectExchange finalResultsExchange(
@Value("${rabbitmq.final.exchange.name}") String exchangeName
) {
return new DirectExchange(exchangeName);
}

@Bean
public Queue finalResultsQueue(
@Value("${rabbitmq.final.queue.name}") String queueName
) {
return new Queue(queueName);
}

@Bean
public Binding finalResultsBinding(
Queue finalResultsQueue,
DirectExchange finalResultsExchange,
@Value("${rabbitmq.final.routing.key}") String routingKey
) {
return BindingBuilder.bind(finalResultsQueue).to(finalResultsExchange).with(routingKey);
}
}
32 changes: 32 additions & 0 deletions aggregator/src/main/java/ru/ifmo/dto/AggregatedResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ru.ifmo.dto;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

import lombok.Data;

@Data
public class AggregatedResult {
private String aggregationId;
private LocalDateTime startTime;
private LocalDateTime endTime;
private Long processingDurationMs;
private int totalSections;
private List<String> processedTaskIds;

private Long totalWordCount;

private Map<String, Integer> mergedTopWords;

private String overallSentiment; // POSITIVE, NEGATIVE, NEUTRAL
private Double averageSentimentScore;
private Map<String, Integer> sentimentDistribution;

private List<String> modifiedTextSections;
private String combinedModifiedText;

private List<String> allSortedSentences;

private List<SectionResult> sectionResults;
}
16 changes: 16 additions & 0 deletions aggregator/src/main/java/ru/ifmo/dto/SectionResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.ifmo.dto;

import lombok.Data;
import java.util.List;
import java.util.Map;

@Data
public class SectionResult {
private String taskId;
private Integer wordCount;
private Map<String, Integer> topWords;
private String sentiment;
private Double sentimentScore;
private String modifiedText;
private List<String> sortedSentences;
}
13 changes: 13 additions & 0 deletions aggregator/src/main/java/ru/ifmo/dto/SessionInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.ifmo.dto;

import java.time.LocalDateTime;

import lombok.Data;

@Data
public class SessionInfo {
private String sessionId;
private int expectedTaskCount;
private String description;
private LocalDateTime startTime;
}
Loading