Files
yourpart3/src/houseworker.cpp
Torsten Schulz (local) bd961a03d4 Aktualisiere WebSocket-Server und Daemon-Konfiguration
- Ändere die Pfade für SSL-Zertifikate in der Konfigurationsdatei.
- Verbessere die Fehlerbehandlung beim Entfernen alter vorbereiteter Anweisungen in HouseWorker.
- Füge Debug-Ausgaben zur Nachverfolgung von Verbindungen und Nachrichten im WebSocket-Server hinzu.
- Implementiere Timeout-Logik für das Stoppen von Worker- und Watchdog-Threads.
- Optimiere die Signalverarbeitung und Shutdown-Logik in main.cpp für bessere Responsivität.
2026-01-14 14:38:42 +01:00

79 lines
2.7 KiB
C++

#include "houseworker.h"
#include <iostream>
HouseWorker::HouseWorker(ConnectionPool &pool, MessageBroker &broker):
Worker(pool, broker, "HouseWorker") {
}
HouseWorker::~HouseWorker() {
}
void HouseWorker::run() {
auto lastExecutionTime = std::chrono::steady_clock::now();
auto lastHouseStateChange = std::chrono::system_clock::now();
while (runningWorker) {
signalActivity();
auto now = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now - lastExecutionTime).count();
if (elapsed >= 3600) {
performTask();
}
auto nowSystem = std::chrono::system_clock::now();
auto lastDay = floor<std::chrono::days>(lastHouseStateChange);
auto today = floor<std::chrono::days>(nowSystem);
if (lastDay < today) {
performHouseStateChange();
lastHouseStateChange = nowSystem;
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
void HouseWorker::performTask() {
try {
setCurrentStep("Get Database Connection");
ConnectionGuard connGuard(pool);
auto &db = connGuard.get();
setCurrentStep("Get new houses data");
db.prepare("QUERY_GET_NEW_HOUSE_DATA", QUERY_GET_NEW_HOUSE_DATA);
const auto newHouses = db.execute("QUERY_GET_NEW_HOUSE_DATA");
for (const auto &newHouse: newHouses) {
db.prepare("QUERY_ADD_NEW_BUYABLE_HOUSE", QUERY_ADD_NEW_BUYABLE_HOUSE);
db.execute("QUERY_ADD_NEW_BUYABLE_HOUSE", { newHouse.at("house_id") });
}
} catch (const std::exception &e) {
std::cerr << "[HouseWorker] Fehler bei der Datenbankoperation: " << e.what() << std::endl;
}
}
void HouseWorker::performHouseStateChange() {
try {
ConnectionGuard connGuard(pool);
auto &db = connGuard.get();
// Entferne alte vorbereitete Anweisungen falls sie existieren
try {
db.remove("QUERY_UPDATE_BUYABLE_HOUSE_STATE");
} catch (...) {
// Ignoriere Fehler beim Entfernen
}
try {
db.remove("QUERY_UPDATE_USER_HOUSE_STATE");
} catch (...) {
// Ignoriere Fehler beim Entfernen
}
// Bereite neue Anweisungen vor
db.prepare("QUERY_UPDATE_BUYABLE_HOUSE_STATE", QUERY_UPDATE_BUYABLE_HOUSE_STATE);
db.prepare("QUERY_UPDATE_USER_HOUSE_STATE", QUERY_UPDATE_USER_HOUSE_STATE);
// Führe die Anweisungen aus
db.execute("QUERY_UPDATE_BUYABLE_HOUSE_STATE");
db.execute("QUERY_UPDATE_USER_HOUSE_STATE");
} catch(const std::exception &e) {
std::cerr << "[HouseWorker] Fehler bei der Datenbankoperation: " << e.what() << std::endl;
}
}