72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
#include "event_manager.h"
|
|
|
|
#include "logging.h"
|
|
|
|
namespace zsy
|
|
{
|
|
EventManager::Event::Event(std::string name, const std::string &data)
|
|
: name(std::move(name))
|
|
{
|
|
if (data.empty())
|
|
{
|
|
this->data = std::nullopt;
|
|
} else
|
|
{
|
|
this->data = nlohmann::json::parse(data);
|
|
}
|
|
}
|
|
|
|
EventManager::EventManager(): threadPool(std::make_shared<ThreadPool>("事件线程池", 10))
|
|
{
|
|
}
|
|
|
|
void EventManager::subscribe(const std::string &name, const EventHandler &handler)
|
|
{
|
|
std::lock_guard lock(handlersMutex);
|
|
auto handlerPtr = std::make_shared<EventHandler>(handler);
|
|
handlers[name].push_back(handlerPtr);
|
|
}
|
|
|
|
void EventManager::publish(const std::string &name, const std::string &data) noexcept
|
|
{
|
|
LOGGER_INFO("发布事件:{} {}", name, data);
|
|
|
|
HandlerList *list = nullptr;
|
|
|
|
{
|
|
std::shared_lock lock(handlersMutex);
|
|
auto it = handlers.find(name);
|
|
if (it != handlers.end())
|
|
{
|
|
list = &it->second;
|
|
} else
|
|
{
|
|
LOGGER_WARN("无处理器,事件:{}", name);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (list == nullptr || list->size() == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
threadPool->submit([list, name, data]
|
|
{
|
|
for (auto fn_ptr: *list)
|
|
{
|
|
try
|
|
{
|
|
(*fn_ptr.get())(Event(name, data));
|
|
} catch (const std::exception &e)
|
|
{
|
|
LOGGER_ERROR("事件处理异常:{} {}", name, e.what());
|
|
}catch (...)
|
|
{
|
|
LOGGER_ERROR("事件处理异常:{}", name);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
} // zsy
|