Compare commits
2 Commits
ec1cd5f98c
...
ce8583c049
Author | SHA1 | Date | |
---|---|---|---|
ce8583c049 | |||
0e7013bf28 |
92
afanasev_dmitry_lab_2/.gitignore
vendored
Normal file
92
afanasev_dmitry_lab_2/.gitignore
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
data/
|
||||
|
||||
##############################
|
||||
## Java
|
||||
##############################
|
||||
.mtj.tmp/
|
||||
*.class
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
||||
*.nar
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
|
||||
##############################
|
||||
## Maven
|
||||
##############################
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
pom.xml.bak
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
##############################
|
||||
## Gradle
|
||||
##############################
|
||||
bin/
|
||||
build/
|
||||
.gradle
|
||||
.gradletasknamecache
|
||||
gradle-app.setting
|
||||
!gradle-wrapper.jar
|
||||
|
||||
##############################
|
||||
## IntelliJ
|
||||
##############################
|
||||
out/
|
||||
.idea/
|
||||
.idea_modules/
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
|
||||
##############################
|
||||
## Eclipse
|
||||
##############################
|
||||
.settings/
|
||||
bin/
|
||||
tmp/
|
||||
.metadata
|
||||
.classpath
|
||||
.project
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.loadpath
|
||||
.factorypath
|
||||
|
||||
##############################
|
||||
## NetBeans
|
||||
##############################
|
||||
nbproject/private/
|
||||
build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
nbactions.xml
|
||||
nb-configuration.xml
|
||||
|
||||
##############################
|
||||
## Visual Studio Code
|
||||
##############################
|
||||
.vscode/
|
||||
.code-workspace
|
||||
|
||||
##############################
|
||||
## OS X
|
||||
##############################
|
||||
.DS_Store
|
||||
|
||||
##############################
|
||||
## Miscellaneous
|
||||
##############################
|
||||
*.log
|
38
afanasev_dmitry_lab_2/README.md
Normal file
38
afanasev_dmitry_lab_2/README.md
Normal file
@ -0,0 +1,38 @@
|
||||
# Лабораторная работа 2
|
||||
|
||||
## Описание
|
||||
Данная лабораторная работа предназначена для настройки 2 сервисов (простейшего распределенного приложения) с использованием Docker Compose. **FirstService** — ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt. **SecondService** — ищет наименьшее число из файла /var/result/data.txt (сгенерирован 1-ым сервисом) и сохраняет его третью степень в /var/result/result.txt.
|
||||
|
||||
## Запуск проекта
|
||||
1. Убедитесь, что у вас установлены **Docker** и **Docker Compose**.
|
||||
2. Клонируйте репозиторий с данным проектом.
|
||||
3. В командной строке перейдите в директорию с файлом `docker-compose.yml`.
|
||||
4. Запустите команды:
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
Эта команда запустит контейнеры в фоновом режиме.
|
||||
5. После запуска:
|
||||
- Посмотреть логи первого сервиса о том, что файл создался успешно.
|
||||
- Посмотреть логи второго сервиса о том, что он обработал созданный первым сервисом файл.
|
||||
|
||||
## Конфигурация
|
||||
В файле `docker-compose.yml` определены следующие сервисы:
|
||||
- **FirstService**:
|
||||
- Создает образ из директории `firstService`.
|
||||
- Использует локальную директорию `/var/data` и общую `/var/result` для хранения данных.
|
||||
- **SecondService**:
|
||||
- Создает образ из директории `secondService`.
|
||||
- Использует общую `/var/result` директорию для хранения данных.
|
||||
- Запускается после первого сервиса.
|
||||
|
||||
## Остановка проекта
|
||||
Для остановки контейнеров запустите:
|
||||
```bash
|
||||
docker-compose down
|
||||
```
|
||||
Это завершит работу всех контейнеров.
|
||||
|
||||
## Примечания
|
||||
- При необходимости можно изменить директорию с данными или другие параметры, отредактировав файл `docker-compose.yml`.
|
||||
- Ссылка на демонстрацию работы программы: https://vk.com/video215756667_456239452?list=ln-rAyQWJj8q7ezqCaZzL
|
17
afanasev_dmitry_lab_2/docker-compose.yml
Normal file
17
afanasev_dmitry_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,17 @@
|
||||
version: '3.9'
|
||||
|
||||
services:
|
||||
first-service:
|
||||
build: ./firstService # Путь к докер-файлу 1 приложения
|
||||
volumes:
|
||||
- D:/java/DAS_2024_1/afanasev_dmitry_lab_2/data:/var/data # Монтируем директорию с данными
|
||||
- common-volume:/var/result # Монтируем общую директорию (нужна 2-му сервису для работы)
|
||||
second-service:
|
||||
build: ./secondService # Путь к докер-файлу 2 приложения
|
||||
volumes:
|
||||
- common-volume:/var/result # Монтируем общую директорию (нужна 2-му сервису для работы)
|
||||
depends_on:
|
||||
- first-service # Запуск после первого сервиса
|
||||
|
||||
volumes: # Именованные тома
|
||||
common-volume: # Общий для 2-ух сервисов
|
17
afanasev_dmitry_lab_2/firstService/Dockerfile
Normal file
17
afanasev_dmitry_lab_2/firstService/Dockerfile
Normal file
@ -0,0 +1,17 @@
|
||||
# Используем образ с Java 17
|
||||
FROM bellsoft/liberica-openjdk-alpine:17.0.8
|
||||
|
||||
# Создаем директорию для исходных файлов
|
||||
RUN mkdir /var/data
|
||||
|
||||
# Создаем директорию для приложения
|
||||
WORKDIR /app
|
||||
|
||||
# Копируем файлы приложения в контейнер
|
||||
COPY src /app/src
|
||||
|
||||
# Компилируем приложение
|
||||
RUN javac /app/src/FirstService.java
|
||||
|
||||
# Определяем команду для запуска приложения
|
||||
CMD ["java", "-cp", "/app/src", "FirstService"]
|
52
afanasev_dmitry_lab_2/firstService/src/FirstService.java
Normal file
52
afanasev_dmitry_lab_2/firstService/src/FirstService.java
Normal file
@ -0,0 +1,52 @@
|
||||
import java.io.*;
|
||||
import java.nio.file.*;
|
||||
|
||||
public class FirstService {
|
||||
// 1. Ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt.
|
||||
|
||||
public static void main(String[] args) {
|
||||
Path sourceDir = Paths.get("/var/data");
|
||||
Path destinationDir = Paths.get("/var/result");
|
||||
Path destinationFile = destinationDir.resolve("data.txt");
|
||||
Path largestFile = null;
|
||||
long maxLineCount = 0;
|
||||
|
||||
try {
|
||||
// существует ли каталог /var/result, если нет, создаем
|
||||
if (!Files.exists(destinationDir)) {
|
||||
Files.createDirectories(destinationDir);
|
||||
} else {
|
||||
// иначе чистим
|
||||
try (DirectoryStream<Path> stream = Files.newDirectoryStream(destinationDir)) {
|
||||
for (Path file : stream) {
|
||||
Files.delete(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// поиск файла с наибольшим количеством строк в каталоге /var/data
|
||||
try (DirectoryStream<Path> stream = Files.newDirectoryStream(sourceDir)) {
|
||||
for (Path file : stream) {
|
||||
if (Files.isRegularFile(file)) {
|
||||
long lineCount = Files.lines(file).count();
|
||||
if (lineCount > maxLineCount) {
|
||||
maxLineCount = lineCount;
|
||||
largestFile = file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// копируем файл с наибольшим количеством строк в /var/result/data.txt
|
||||
if (largestFile != null) {
|
||||
Files.copy(largestFile, destinationFile, StandardCopyOption.REPLACE_EXISTING);
|
||||
System.out.println("Файл " + largestFile + " скопирован в " + destinationFile);
|
||||
} else {
|
||||
System.out.println("В каталоге " + sourceDir + " нет файлов.");
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
17
afanasev_dmitry_lab_2/secondService/Dockerfile
Normal file
17
afanasev_dmitry_lab_2/secondService/Dockerfile
Normal file
@ -0,0 +1,17 @@
|
||||
# Используем образ с Java 17
|
||||
FROM bellsoft/liberica-openjdk-alpine:17.0.8
|
||||
|
||||
# Создаем директорию для исходных файлов
|
||||
RUN mkdir /var/data
|
||||
|
||||
# Создаем директорию для приложения
|
||||
WORKDIR /app
|
||||
|
||||
# Копируем файлы приложения в контейнер
|
||||
COPY src /app/src
|
||||
|
||||
# Компилируем приложение
|
||||
RUN javac /app/src/SecondService.java
|
||||
|
||||
# Определяем команду для запуска приложения
|
||||
CMD ["java", "-cp", "/app/src", "SecondService"]
|
51
afanasev_dmitry_lab_2/secondService/src/SecondService.java
Normal file
51
afanasev_dmitry_lab_2/secondService/src/SecondService.java
Normal file
@ -0,0 +1,51 @@
|
||||
import java.io.*;
|
||||
import java.nio.file.*;
|
||||
import java.util.*;
|
||||
|
||||
public class SecondService {
|
||||
// 2. Ищет наименьшее число из файла /var/result/data.txt и сохраняет его третью степень в /var/result/result.txt.
|
||||
|
||||
public static void main(String[] args) {
|
||||
Path sourceFile = Paths.get("/var/result/data.txt");
|
||||
Path destinationDir = Paths.get("/var/result");
|
||||
Path destinationFile = destinationDir.resolve("result.txt");
|
||||
|
||||
try {
|
||||
// создание /var/result, если не существует
|
||||
if (!Files.exists(destinationDir)) {
|
||||
Files.createDirectories(destinationDir);
|
||||
}
|
||||
|
||||
// читаем числа из файла и находим наименьшее
|
||||
List<Integer> numbers = new ArrayList<>();
|
||||
try (BufferedReader reader = Files.newBufferedReader(sourceFile)) {
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
try {
|
||||
numbers.add(Integer.parseInt(line.trim()));
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Некорректная строка: " + line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!numbers.isEmpty()) {
|
||||
// находим наименьшее число и его третью степень
|
||||
int minNumber = Collections.min(numbers);
|
||||
int minNumberCubed = (int) Math.pow(minNumber, 3);
|
||||
|
||||
// записываем результат в /var/result/result.txt
|
||||
try (BufferedWriter writer = Files.newBufferedWriter(destinationFile)) {
|
||||
writer.write(String.valueOf(minNumberCubed));
|
||||
System.out.println("Третья степень наименьшего числа - " + minNumber + " (" + minNumberCubed +
|
||||
") сохранена в " + destinationFile);
|
||||
}
|
||||
} else {
|
||||
System.out.println("Файл " + sourceFile + " пуст или не содержит чисел.");
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user