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:
Torsten Schulz (local)
2025-09-04 14:22:01 +02:00
parent c9235034b1
commit 8d0d1bc187
4 changed files with 118 additions and 17 deletions

View File

@@ -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;