DragonNest/Server/ServiceManagerEx/Scheduler.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

237 lines
No EOL
5.8 KiB
C++

#include "StdAfx.h"
#include "Scheduler.h"
#include "Log.h"
#include "ServiceManagerEx.h"
#include "HttpUpdater.h"
#include "ServerReporter.h"
#include "ServiceManager.h"
#include <sstream>
namespace SimpleScheduler
{
// ScheduleObj
CScheduleObj::CScheduleObj(Reference* pReference, const wstring& name, CTime curTime, CTime beginTime, CTime endTime, CTimeSpan interval, bool repeat)
: pReference(pReference), name(name), beginTime(beginTime), endTime(endTime), interval(interval), repeat(repeat), eventTime(beginTime)
{
ExtendEventTime(curTime);
}
CScheduleObj::~CScheduleObj()
{
}
const wstring& CScheduleObj::Name() const
{
return name;
}
bool CScheduleObj::IsRepeat() const
{
return repeat;
}
bool CScheduleObj::IsPassedEndTime(CTime curTime) const
{
return (endTime < curTime);
}
int CScheduleObj::Update(CTime curTime)
{
if (eventTime > curTime)
return NO_EVENT;
if (IsPassedEndTime(curTime))
{
g_Log.Log(LogType::_NORMAL, L"%s Schedule ended.\n", name.c_str());
return END_SCHEDULE;
}
OnEvent();
ExtendEventTime(curTime);
g_Log.Log(LogType::_NORMAL, L"%s Scheduled. [next time : %s]\n", name.c_str(), eventTime.Format(L"%Y-%m-%d %H:%M:%S").GetBuffer(0));
if (!IsRepeat())
{
g_Log.Log(LogType::_NORMAL, L"%s Schedule ended.\n", name.c_str());
return END_SCHEDULE;
}
return REPEAT_SCHEDULE;
}
void CScheduleObj::OnRegister()
{
g_Log.Log(LogType::_NORMAL, L"%s schedule registered. [next time : %s]\n", name.c_str(), eventTime.Format(L"%Y-%m-%d %H:%M:%S").GetBuffer(0));
}
void CScheduleObj::ExtendEventTime(CTime curTime)
{
while (eventTime <= curTime)
{
eventTime += interval;
}
}
// ScheduleLog
CScheduleLog::CScheduleLog(Reference* pReference, const wstring& name, CTime curTime, CTime beginTime, CTime endTime, CTimeSpan interval, bool repeat)
: CScheduleObj(pReference, name, curTime, beginTime, endTime, interval, repeat)
{
}
CScheduleLog::~CScheduleLog()
{
}
void CScheduleLog::OnEvent()
{
}
// ScheduleServerReport
CScheduleServerReport::CScheduleServerReport(Reference* pReference, const wstring& name, CTime curTime, CTime beginTime, CTime endTime, CTimeSpan interval, bool repeat)
: CScheduleObj(pReference, name, curTime, beginTime, endTime, interval, repeat)
{
}
CScheduleServerReport::~CScheduleServerReport()
{
}
void CScheduleServerReport::OnEvent()
{
const EMailConfig& email = pReference->GetConfigEx().GetEMailConfig();
RequestParam::boundary = email.boundary;
vector<RequestParam> parameters;
parameters.push_back(RequestParam(L"SenderAddress", email.sender));
ServerReport::CServerReporter reporter;
const ConfigEx& config = pReference->GetConfigEx();
vector<ServerReport::CReportView*> report;
reporter.Report(config.serverReportDays, config.serverReportDetail, report);
wstring buffer;
reporter.Report(config.serverReportDays, config.serverReportDetail, buffer);
wstringstream ss;
for (int i=0; i<(int)email.allowance.size(); i++)
{
if (!reporter.is_dbdelay && email.allowance[i].find(L"DB delayed") == 0)
continue;
ss << email.recipients[i] << L";";
}
parameters.push_back(RequestParam(L"ReceiverAddress", ss.str()));
if (buffer.size() >= 1024 * 1024 * 10)
buffer.clear();
ss.str(L"");
CTime time = CTime::GetCurrentTime();
ss << GenerateServerReportNation() << L" " << time.Format(L"%Y-%m-%d").GetBuffer() << L" " << email.subject;
parameters.push_back(RequestParam(L"Subject", ss.str()));
ss.str(L"");
wchar_t partition_text [256];
g_pServiceManager->GetPartitionText(partition_text);
ss << L"<" << partition_text << L">" << L"\r\n\r\n";
for each (ServerReport::CReportView* pReport in report)
{
ss << L"<" << pReport->GetDay() << L">" << L"\r\n\r\n";
for each (ServerReport::View* pView in pReport->GetViews())
{
ss << pView->overview.str();
}
ss << L"\r\n\r\n";
delete pReport;
}
parameters.push_back(RequestParam(L"Contents", ss.str()));
vector<RequestParam> files;
files.push_back(RequestParam(L"AttachFile", GenerateServerReportFileName(), buffer));
CHttpUpdater http;
if (!http.QueryPostUpload(email.serverIp.c_str(), NULL, NULL, email.serverPage.c_str(), parameters, files))
return;
}
// Scheduler
CScheduler::CScheduler()
{
}
CScheduler::~CScheduler()
{
for each (map<wstring, CScheduleObj*>::value_type v in schedules)
{
delete v.second;
}
}
bool CScheduler::Register(CScheduleObj* pObj)
{
if (!pObj)
return false;
if (!schedules.insert(make_pair(pObj->Name(), pObj)).second)
return false;
pObj->OnRegister();
return true;
}
void CScheduler::Unregister(const wstring& name)
{
map<wstring, CScheduleObj*>::iterator it = schedules.find(name);
if (it == schedules.end())
return;
delete it->second;
schedules.erase(it);
}
void CScheduler::Update()
{
CTime time = CTime::GetCurrentTime();
for (map<wstring, CScheduleObj*>::iterator it = schedules.begin(); it != schedules.end();)
{
CScheduleObj* pObj = it->second;
if (pObj->Update(time) == END_SCHEDULE)
it = schedules.erase(it);
else
++it;
}
}
void CScheduler::Clear()
{
for each (map<wstring, CScheduleObj*>::value_type v in schedules)
{
delete v.second;
}
schedules.clear();
}
CScheduleObj* CScheduler::GenerateScheduleObj(Reference* pReference, CTime curTime, const ScheduleJob* pScheduleJob)
{
if (curTime >= pScheduleJob->endTime)
return NULL;
if (pScheduleJob->type.compare(L"ServerReport") == 0)
return new CScheduleServerReport(pReference, pScheduleJob->name, curTime, pScheduleJob->beginTime, pScheduleJob->endTime, pScheduleJob->interval, pScheduleJob->repeat);
else if (pScheduleJob->type.compare(L"Log") == 0)
return new CScheduleLog(pReference, pScheduleJob->name, curTime, pScheduleJob->beginTime, pScheduleJob->endTime, pScheduleJob->interval, pScheduleJob->repeat);
return NULL;
}
};