kutygin_andrey_lab_2_ready
This commit is contained in:
parent
d867909883
commit
c7ccb94de9
63
kutygin_andrey_lab_1/.idea/workspace.xml
Normal file
63
kutygin_andrey_lab_1/.idea/workspace.xml
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="2825a2d7-cbe6-410f-9785-96603cbb0f02" name="Changes" comment="" />
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="MarkdownSettingsMigration">
|
||||||
|
<option name="stateVersion" value="1" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectId" id="2aWZgD9jVzSrrT33mt6jGLtpCOt" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"project.structure.last.edited": "Modules",
|
||||||
|
"project.structure.proportion": "0.15",
|
||||||
|
"project.structure.side.proportion": "0.2"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="RecentsManager">
|
||||||
|
<key name="MoveFile.RECENT_KEYS">
|
||||||
|
<recent name="C:\Users\kutyg\Downloads\pibd-22-internet-programming-Lab5 (1)\kutygin_andrey_lab_1" />
|
||||||
|
</key>
|
||||||
|
</component>
|
||||||
|
<component name="RunManager">
|
||||||
|
<configuration name="docker-compose.yml.rabbitmq: Compose Deployment" type="docker-deploy" factoryName="docker-compose.yml" temporary="true" server-name="Docker">
|
||||||
|
<deployment type="docker-compose.yml">
|
||||||
|
<settings>
|
||||||
|
<option name="services">
|
||||||
|
<list>
|
||||||
|
<option value="rabbitmq" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="sourceFilePath" value="docker-compose.yml" />
|
||||||
|
</settings>
|
||||||
|
</deployment>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<recent_temporary>
|
||||||
|
<list>
|
||||||
|
<item itemvalue="Docker.docker-compose.yml.rabbitmq: Compose Deployment" />
|
||||||
|
</list>
|
||||||
|
</recent_temporary>
|
||||||
|
</component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="2825a2d7-cbe6-410f-9785-96603cbb0f02" name="Changes" comment="" />
|
||||||
|
<created>1704436409086</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1704436409086</updated>
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
</project>
|
3
kutygin_andrey_lab_2/.idea/.gitignore
vendored
Normal file
3
kutygin_andrey_lab_2/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
6
kutygin_andrey_lab_2/.idea/jpa-buddy.xml
Normal file
6
kutygin_andrey_lab_2/.idea/jpa-buddy.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="JpaBuddyIdeaProjectConfig">
|
||||||
|
<option name="renamerInitialized" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
9
kutygin_andrey_lab_2/.idea/misc.xml
Normal file
9
kutygin_andrey_lab_2/.idea/misc.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="18" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectType">
|
||||||
|
<option name="id" value="jpab" />
|
||||||
|
</component>
|
||||||
|
</project>
|
8
kutygin_andrey_lab_2/.idea/modules.xml
Normal file
8
kutygin_andrey_lab_2/.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/kutygin_andrey_lab_2.iml" filepath="$PROJECT_DIR$/kutygin_andrey_lab_2.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
121
kutygin_andrey_lab_2/README.md
Normal file
121
kutygin_andrey_lab_2/README.md
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
**Задание**
|
||||||
|
***
|
||||||
|
Цель: изучение техники создания простого распределённого приложения.
|
||||||
|
|
||||||
|
**Задачи**
|
||||||
|
***
|
||||||
|
|
||||||
|
Согласно варианту (0 и 1) разработать два приложения такие, что результат первого является исходными данными для второго.
|
||||||
|
|
||||||
|
Изучить файлы сборки образов docker и разработать их для созданных приложений.
|
||||||
|
|
||||||
|
Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
|
||||||
|
|
||||||
|
Правильно закоммитить результат без лишних файлов.
|
||||||
|
|
||||||
|
Оформить pull request по правилам и отправить его на проверку.
|
||||||
|
|
||||||
|
**Ход работы**
|
||||||
|
***
|
||||||
|
**Разворачивание сервисов:**
|
||||||
|
***
|
||||||
|
Были разработаны два приложения на java:
|
||||||
|
|
||||||
|
worker-1 - Формирует файл /var/result/data.txt из файла, где было найдено самое большое число /var/data.
|
||||||
|
|
||||||
|
worker-2 - Ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt.
|
||||||
|
|
||||||
|
**Исходные файлы**
|
||||||
|
|
||||||
|
Исходные файлы содержат целые числа.
|
||||||
|
|
||||||
|
В /var/result/data.txt проверяются числа из каждого файла и выбирается самое большое
|
||||||
|
|
||||||
|
**Firsttxt.txt:**
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
|
||||||
|
**Secondtxt.txt**
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
|
||||||
|
**Thirdtxt.txt**
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
|
||||||
|
В /var/result/result.txt записывается число 100 - квадрат наибольшего числа - 10
|
||||||
|
|
||||||
|
**Dockerfile**
|
||||||
|
|
||||||
|
Для данной работы были созданы идентичные докер-файлы в обоих проектах.
|
||||||
|
````
|
||||||
|
FROM openjdk:17
|
||||||
|
|
||||||
|
RUN mkdir /var/data
|
||||||
|
RUN mkdir /var/result
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY src /app/src
|
||||||
|
|
||||||
|
RUN javac /app/src/Main.java
|
||||||
|
|
||||||
|
CMD ["java", "-cp", "/app/src", "Main"]
|
||||||
|
````
|
||||||
|
|
||||||
|
FROM - выбор базового образа
|
||||||
|
|
||||||
|
RUN - создание директории внутри контейнера
|
||||||
|
|
||||||
|
WORKDIR - установка рабочей директории для последующих команд
|
||||||
|
|
||||||
|
COPY - копирование содержимого директории внутрь контейнера
|
||||||
|
|
||||||
|
RUN - компиляция исходного кода Main.java внутри контейнера
|
||||||
|
|
||||||
|
CMD - определение команды, которая выполняется при запуске контейнера. В данном случае происходит запуск программы на java и указывается пусть до Main.java
|
||||||
|
|
||||||
|
**docker-compose.yml**
|
||||||
|
````
|
||||||
|
version: "3" #формат конфигурации Docker Compose версии 3
|
||||||
|
|
||||||
|
services: #определение сервисов
|
||||||
|
|
||||||
|
worker1:
|
||||||
|
|
||||||
|
build:
|
||||||
|
|
||||||
|
context: /worker-1 #путь к контексту сборки
|
||||||
|
|
||||||
|
dockerfile: Dockerfile #имя докерфайла
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- .\var\data:/var/data #том для папки файлов
|
||||||
|
- .\var\result:/var/result #том для папки результатов
|
||||||
|
|
||||||
|
worker2:
|
||||||
|
|
||||||
|
- depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
|
||||||
|
worker1
|
||||||
|
build:
|
||||||
|
context: /worker-2 #путь к контексту сборки
|
||||||
|
|
||||||
|
- dockerfile: Dockerfile #имя докерфайла
|
||||||
|
|
||||||
|
- volumes:
|
||||||
|
- .\var\result:/var/data #том для папки файлов
|
||||||
|
- .\var\result:/var/result #том для папки результатов
|
||||||
|
````
|
||||||
|
|
||||||
|
Видео: https://disk.yandex.ru/d/jpeOKQ_PAO0c0Q
|
18
kutygin_andrey_lab_2/docker-compose.yml
Normal file
18
kutygin_andrey_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
version: "3" #формат конфигурации Docker Compose версии 3
|
||||||
|
services: #определение сервисов
|
||||||
|
worker1:
|
||||||
|
build:
|
||||||
|
context: /worker_1 #путь к контексту сборки
|
||||||
|
dockerfile: Dockerfile #имя докерфайла
|
||||||
|
volumes:
|
||||||
|
- .\var\data:/var/data #том для папки файлов
|
||||||
|
- .\var\result:/var/result #том для папки результатов
|
||||||
|
worker2:
|
||||||
|
depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
|
||||||
|
- worker1
|
||||||
|
build:
|
||||||
|
context: /worker_2 #путь к контексту сборки
|
||||||
|
dockerfile: Dockerfile #имя докерфайла
|
||||||
|
volumes:
|
||||||
|
- .\var\result:/var/data #том для папки файлов
|
||||||
|
- .\var\result:/var/result #том для папки результатов
|
11
kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml
Normal file
11
kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
5
kutygin_andrey_lab_2/var/data/Firsttxt.txt
Normal file
5
kutygin_andrey_lab_2/var/data/Firsttxt.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
3
kutygin_andrey_lab_2/var/data/Secondtxt.txt
Normal file
3
kutygin_andrey_lab_2/var/data/Secondtxt.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
10
kutygin_andrey_lab_2/var/data/Thirdtxt.txt
Normal file
10
kutygin_andrey_lab_2/var/data/Thirdtxt.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
10
kutygin_andrey_lab_2/var/result/data.txt
Normal file
10
kutygin_andrey_lab_2/var/result/data.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
1
kutygin_andrey_lab_2/var/result/result.txt
Normal file
1
kutygin_andrey_lab_2/var/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
100.0
|
11
kutygin_andrey_lab_2/worker_1/Dockerfile
Normal file
11
kutygin_andrey_lab_2/worker_1/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
FROM openjdk:17
|
||||||
|
|
||||||
|
RUN mkdir /var/data
|
||||||
|
RUN mkdir /var/result
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY src /app/src
|
||||||
|
|
||||||
|
RUN javac /app/src/Main.java
|
||||||
|
|
||||||
|
CMD ["java", "-cp", "/app/src", "Main"]
|
40
kutygin_andrey_lab_2/worker_1/src/Main.java
Normal file
40
kutygin_andrey_lab_2/worker_1/src/Main.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import java.io.*;
|
||||||
|
import java.nio.file.*;
|
||||||
|
|
||||||
|
//Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
|
||||||
|
public class Main {
|
||||||
|
private static Path findLargestFile(DirectoryStream<Path> stream) throws IOException {
|
||||||
|
long maxSize = 0;
|
||||||
|
Path largestFile = null;
|
||||||
|
|
||||||
|
for (Path file : stream) {
|
||||||
|
long size = Files.size(file);
|
||||||
|
if (size > maxSize) {
|
||||||
|
maxSize = size;
|
||||||
|
largestFile = file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return largestFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Path dataDir = Path.of("/var/data");
|
||||||
|
Path resultDir = Path.of("/var/result");
|
||||||
|
|
||||||
|
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dataDir)) {
|
||||||
|
Path largestFile = findLargestFile(stream);
|
||||||
|
|
||||||
|
if (largestFile != null) {
|
||||||
|
Files.createFile(resultDir.resolve("data.txt"));
|
||||||
|
Files.copy(largestFile, resultDir.resolve("data.txt"), StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
System.out.println(largestFile.getFileName() + " перемещён");
|
||||||
|
} else {
|
||||||
|
System.out.println("Файл не найден");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
kutygin_andrey_lab_2/worker_2/Dockerfile
Normal file
11
kutygin_andrey_lab_2/worker_2/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
FROM openjdk:17
|
||||||
|
|
||||||
|
RUN mkdir /var/data
|
||||||
|
RUN mkdir /var/result
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY src /app/src
|
||||||
|
|
||||||
|
RUN javac /app/src/Main.java
|
||||||
|
|
||||||
|
CMD ["java", "-cp", "/app/src", "Main"]
|
50
kutygin_andrey_lab_2/worker_2/src/Main.java
Normal file
50
kutygin_andrey_lab_2/worker_2/src/Main.java
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import java.io.*;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
//Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Path dataFile = Path.of("/var/result/data.txt");
|
||||||
|
Path resultFile = Path.of("/var/result/result.txt");
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!Files.exists(dataFile)) {
|
||||||
|
System.out.println("Файл data.txt не существует");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> numbers = readNumbersFromFile(dataFile);
|
||||||
|
int maxNumber = findMaxNumber(numbers);
|
||||||
|
|
||||||
|
try (BufferedWriter writer = Files.newBufferedWriter(resultFile)) {
|
||||||
|
writer.write(String.valueOf(Math.pow(maxNumber,2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("квадрат наибольшего числа " + Math.pow(maxNumber,2));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Integer> readNumbersFromFile(Path dataFile) throws IOException {
|
||||||
|
List<Integer> numbers = new ArrayList<>();
|
||||||
|
try (BufferedReader reader = Files.newBufferedReader(dataFile)) {
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
numbers.add(Integer.parseInt(line));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return numbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int findMaxNumber(List<Integer> numbers) {
|
||||||
|
int maxNumber = Integer.MIN_VALUE;
|
||||||
|
for (int number : numbers) {
|
||||||
|
if (number > maxNumber) {
|
||||||
|
maxNumber = number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxNumber;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user