gusev_vladislav_lab_2 #16

Merged
Alexey merged 4 commits from gusev_vladislav_lab_2 into main 2023-11-16 15:38:45 +04:00
35 changed files with 354 additions and 0 deletions

View File

@ -0,0 +1,77 @@
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
1) Согласно вашему варианту (выбирайте любой) разработать два приложения такие, что результат первого является исходными данными для второго.
2) Изучить файлы сборки образов docker и разработать их для созданных приложений.
3) Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
4) Правильно закоммитить результат без лишних файлов.
5) Оформить pull request по правилам и отправить его на проверку.
6)
# Варианты:
- Для Worker1: Ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt.
- Для Worker2: Ищет набольшее число из файла /var/data/data.txt и сохраняет количество таких чисел из последовательности в /var/result/result.txt.
# Как запустить
Командой "docker-compose up -d"
# Работа программы
Для Worker1 создали следующий java файл:
![img.png](screens%2Fimg.png)
И следующий DockerFile:
![img_1.png](screens%2Fimg_1.png)
Для Worker2 создали следующий файл:
![img_2.png](screens%2Fimg_2.png)
И следующий DockerFile:
![img_3.png](screens%2Fimg_3.png)
Файлы с данными:
File1:
![img_4.png](screens%2Fimg_4.png)
File2:
![img_5.png](screens%2Fimg_5.png)
File3:
![img_6.png](screens%2Fimg_6.png)
Теперь создаем docker-compose файл:
![img_7.png](screens%2Fimg_7.png)
Запускаем в cmd с помощью docker-compose up -d:
![img_8.png](screens%2Fimg_8.png)
Образы:
![img_9.png](screens%2Fimg_9.png)
Контейнер:
![img_10.png](screens%2Fimg_10.png)
Файлы появились в папке:
![img_11.png](screens%2Fimg_11.png)
Файл data.txt:
![img_12.png](screens%2Fimg_12.png)
Файл result.txt:
![img_13.png](screens%2Fimg_13.png)
Наибольшее число 986 и число его вхождений равно 3, всё верно.
Видео -> https://drive.google.com/file/d/1Jt1wFrdweIrUhDn-MAA4RKYrktykOekw/view?usp=sharing

View File

@ -0,0 +1,3 @@
123
456
789

View File

@ -0,0 +1,10 @@
412
564
986
785
232
986
877
434
986
086

View File

@ -0,0 +1,6 @@
111
222
333
444
555
666

View File

@ -0,0 +1,17 @@
services:
worker1:
build:
context: /worker1
dockerfile: Dockerfile
volumes:
- D:\java_labs\DAS\gusev_vladislav_lab_2\data:/var/data
- D:\java_labs\DAS\gusev_vladislav_lab_2\result:/var/result
worker2:
build:
context: /worker2
dockerfile: Dockerfile
volumes:
- D:\java_labs\DAS\gusev_vladislav_lab_2\data:/var/data
- D:\java_labs\DAS\gusev_vladislav_lab_2\result:/var/result
depends_on:
- worker1

View File

@ -0,0 +1,10 @@
412
564
986
785
232
986
877
434
986
086

View File

@ -0,0 +1 @@
3

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/worker1.iml" filepath="$PROJECT_DIR$/worker1.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,18 @@
# Используем образ с Java
FROM openjdk:17
# Создаем директории для данных и результата внутри контейнера
RUN mkdir /var/data
RUN mkdir /var/result
# Создаем директорию приложения внутри контейнера
WORKDIR /app
# Копируем исходные файлы вашего Java-приложения внутрь контейнера
COPY src /app/src
# Компилируем Java-код
RUN javac /app/src/Worker1.java
# Запускаем Java-приложение
CMD ["java", "-cp", "/app/src", "Worker1"]

View File

@ -0,0 +1,43 @@
import java.io.*;
import java.nio.file.*;
import java.util.Comparator;
public class Worker1 {
public static void main(String[] args) {
String sourceDirectory = "/var/data";
String destinationDirectory = "/var/result";
try {
copyFileWithMostLines(sourceDirectory, destinationDirectory);
System.out.println("Файл успешно скопирован.");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void copyFileWithMostLines(String sourceDirectory, String destinationDirectory) throws IOException {
Path sourceDir = Paths.get(sourceDirectory);
Path destDir = Paths.get(destinationDirectory);
// Поиск файла с наибольшим числом строк
Path fileWithMostLines = Files.walk(sourceDir)
.filter(Files::isRegularFile)
.max(Comparator.comparingLong(file -> {
try {
return Files.lines(file).count();
} catch (IOException e) {
e.printStackTrace();
return 0L;
}
}))
.orElse(null);
if (fileWithMostLines != null) {
// Копирование файла
Files.copy(fileWithMostLines, Paths.get(destinationDirectory + "/data.txt"), StandardCopyOption.REPLACE_EXISTING);
} else {
System.out.println("Нет файлов для копирования.");
}
}
}

View File

@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/worker2.iml" filepath="$PROJECT_DIR$/worker2.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,18 @@
# Используем образ с Java
FROM openjdk:17
# Создаем директории для данных и результата внутри контейнера
RUN mkdir /var/data
RUN mkdir /var/result
# Создаем директорию приложения внутри контейнера
WORKDIR /app
# Копируем исходные файлы вашего Java-приложения внутрь контейнера
COPY src /app/src
# Компилируем Java-код
RUN javac /app/src/Worker2.java
# Запускаем Java-приложение
CMD ["java", "-cp", "/app/src", "Worker2"]

View File

@ -0,0 +1,47 @@
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
public class Worker2 {
public static void main(String[] args) {
String sourceFilePath = "/var/result/data.txt";
String resultFilePath = "/var/result/result.txt";
try {
int maxNumberOccurrences = countMaxNumberOccurrences(sourceFilePath);
saveResult(resultFilePath, maxNumberOccurrences);
System.out.println("Результат сохранен в файле: " + resultFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
private static int countMaxNumberOccurrences(String filePath) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
int maxNumber = Integer.MIN_VALUE;
int maxNumberCount = 0;
String line;
while ((line = reader.readLine()) != null) {
int number = Integer.parseInt(line.trim());
if (number > maxNumber) {
maxNumber = number;
maxNumberCount = 1; // Новое максимальное число
} else if (number == maxNumber) {
maxNumberCount++; // Увеличиваем количество встреч максимального числа
}
}
return maxNumberCount;
}
}
private static void saveResult(String filePath, int result) throws IOException {
String resultString = Integer.toString(result);
Files.write(Path.of(filePath), resultString.getBytes(), StandardOpenOption.CREATE);
}
}