Implementiere sanften Shutdown und verbessere Server-Stopp-Logik
- Füge Signalhandler in `main.cpp` hinzu, um einen sanften Shutdown bei SIGINT und SIGTERM zu ermöglichen. - Aktualisiere die `Server`- und `SSLServer`-Klassen, um die Stopp-Logik zu verbessern und Threads ordnungsgemäß zu beenden. - Optimiere die Timeout-Werte in der `run`-Methode für eine schnellere Reaktion auf Shutdown-Signale. - Ergänze Logging für den Server-Stopp-Prozess zur besseren Nachverfolgbarkeit.
This commit is contained in:
59
src/main.cpp
59
src/main.cpp
@@ -4,25 +4,64 @@
|
||||
#include "core/ssl_server.h"
|
||||
#include "lib/database.h"
|
||||
#include <iostream>
|
||||
#include <csignal>
|
||||
#include <atomic>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
|
||||
// Global flag for graceful shutdown
|
||||
std::atomic<bool> g_running{true};
|
||||
std::shared_ptr<Yc::Lib::SSLServer> g_sslServer = nullptr;
|
||||
std::shared_ptr<Yc::Lib::Server> g_server = nullptr;
|
||||
|
||||
// Signal handler for graceful shutdown
|
||||
void signalHandler(int signal) {
|
||||
std::cout << "\n[YourChat] Received signal " << signal << ", shutting down gracefully..." << std::endl;
|
||||
g_running = false;
|
||||
|
||||
if (g_sslServer) {
|
||||
g_sslServer->stop();
|
||||
}
|
||||
if (g_server) {
|
||||
g_server->stop();
|
||||
}
|
||||
}
|
||||
|
||||
// main function
|
||||
int main(int, char **) {
|
||||
// Set up signal handlers
|
||||
std::signal(SIGINT, signalHandler);
|
||||
std::signal(SIGTERM, signalHandler);
|
||||
|
||||
auto config = std::make_shared<Yc::Lib::Config>();
|
||||
auto database = std::make_shared<Yc::Lib::Database>(config);
|
||||
|
||||
// Check if SSL is enabled
|
||||
bool sslEnabled = config->value("server", "ssl_enabled").asBool();
|
||||
|
||||
if (sslEnabled) {
|
||||
std::cout << "[YourChat] Starting with SSL/TLS support" << std::endl;
|
||||
auto sslServer = std::make_shared<Yc::Lib::SSLServer>(config, database);
|
||||
sslServer->createRooms();
|
||||
sslServer->run();
|
||||
} else {
|
||||
std::cout << "[YourChat] Starting without SSL/TLS support" << std::endl;
|
||||
auto server = std::make_shared<Yc::Lib::Server>(config, database);
|
||||
server->createRooms(config->group("rooms"));
|
||||
server->run();
|
||||
try {
|
||||
if (sslEnabled) {
|
||||
std::cout << "[YourChat] Starting with SSL/TLS support" << std::endl;
|
||||
g_sslServer = std::make_shared<Yc::Lib::SSLServer>(config, database);
|
||||
g_sslServer->createRooms();
|
||||
g_sslServer->run();
|
||||
} else {
|
||||
std::cout << "[YourChat] Starting without SSL/TLS support" << std::endl;
|
||||
g_server = std::make_shared<Yc::Lib::Server>(config, database);
|
||||
g_server->createRooms(config->group("rooms"));
|
||||
g_server->run();
|
||||
}
|
||||
|
||||
// Main loop - wait for shutdown signal
|
||||
while (g_running) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
}
|
||||
|
||||
std::cout << "[YourChat] Shutdown complete." << std::endl;
|
||||
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << "[YourChat] Error: " << e.what() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user