-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
127 lines (119 loc) · 5.61 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <string>
#include <memory>
#include <algorithm>
#include "gateway.hpp"
#include "src/utils/mylogger.hpp"
void sigint_handler(int);
const char* CONFIG_FILE_PATH = "default_config.toml";
std::atomic<bool> running(true);
int main() {
// инициализируем логгера
init_logger();
std::shared_ptr<spdlog::logger> restart_error_logger = spdlog::get("restart_errors");
try {
// создаем шлюз
std::shared_ptr<ftx::gateway> gateway = std::make_shared<ftx::gateway>(CONFIG_FILE_PATH);
bss::error error;
// получаем источник получения конфига
std::string source = gateway->get_config_source();
// если источник конфига - файл
if (source == "file") {
if(std::filesystem::exists("config.json")) {
if (gateway->load_config_from_file(error)) {
gateway->send_message("Конфигурация загружена из файла.");
} else {
gateway->send_error(error.to_string());
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
}
} else {
error.describe("В параметрах конфигурации указан режим работы с файлом, но файла не существует");
gateway->send_error(error.to_string());
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
}
} else if (source == "agent") {
if (gateway->create_agent_channel()) {
gateway->send_config_request();
// получаем конфиг (ожидаем 5 секунд, если получаем быстрее, то выходим из цикла)
int try_count = 0;
while( try_count < 5) {
gateway->pool_from_agent();
if (gateway->has_config())
break;
else
std::this_thread::sleep_for(1s);
++try_count;
}
// если конфиг не был получен, то работать нет смысла
if (!gateway->has_config()) {
gateway->send_error("Файл конфигурации от агента не получен.");
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
} else {
gateway->send_message("Конфигурация получена от агента.");
}
} else {
gateway->send_error("Ошибка создания aeron канала для агента.");
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
}
} else if (source == "api") {
if (gateway->get_config_from_api(error)) {
// если конфиг не был получен, то работать нет смысла
if (!gateway->has_config()) {
gateway->send_error("Файл конфигурации с сервера не получен.");
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
} else {
gateway->send_message("Конфигурация получена с сервера.");
}
} else {
gateway->send_error(error.to_string());
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
}
} else {
gateway->send_error("Файл конфигурации содержит неизвестный источник получения конфига.");
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
}
// продолжаем подготовку к запуску
if (not gateway->preparation_for_launch()) {
return EXIT_FAILURE;
}
signal(SIGINT, sigint_handler);
// главный цикл
while(running){
try{
gateway->pool();
}
catch(std::exception &ex){
// получим описание ошибки
std::string sourceException = ex.what();
// залогируем ошибку
restart_error_logger->error(sourceException);
// проверям источник исключения
if(sourceException == "on_read: public channel")
{
// перезапускаем публичный WS
gateway->restart_public_ws();
}
else if(sourceException == "on_read: private channel"){
// перезапускаем приватный WS и укажем причину перезапуска
gateway->restart_private_ws("by exception");
}
}
}
} catch (std::invalid_argument &invlaid_arg) {
restart_error_logger->info("{} Настройте файл конфигурации и запустите шлюз заново.", invlaid_arg.what());
std::this_thread::sleep_for(1s);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
void sigint_handler(int)
{
running = false;
}