m_IdleServices.erase(service);
m_PendingServices.insert(service);
- service->BeginExecuteCheck(boost::bind(&CheckerComponent::CheckCompletedHandler, this, service));
+ try {
+ service->BeginExecuteCheck(boost::bind(&CheckerComponent::CheckCompletedHandler, this, service));
+ } catch (const exception& ex) {
+ Logger::Write(LogCritical, "checker", "Exception occured while checking service '" + service->GetName() + "': " + ex.what());
+ }
tasks++;
}
scheduleInfo->Set("schedule_start", GetNextCheck());
scheduleInfo->Set("execution_start", Utility::GetTime());
- vector<Value> arguments;
- arguments.push_back(static_cast<Service::Ptr>(GetSelf()));
- ScriptTask::Ptr task;
- task = InvokeMethod("check", arguments, boost::bind(&Service::CheckCompletedHandler, this, scheduleInfo, _1, callback));
- assert(task); /* TODO: gracefully handle missing methods */
+ try {
+ vector<Value> arguments;
+ arguments.push_back(static_cast<Service::Ptr>(GetSelf()));
+ ScriptTask::Ptr task;
+ task = InvokeMethod("check", arguments, boost::bind(&Service::CheckCompletedHandler, this, scheduleInfo, _1, callback));
+ Set("current_task", task);
+ } catch (...) {
+ /* something went wrong while setting up the method call -
+ * reschedule the service and call the callback anyway. */
+
+ UpdateNextCheck();
- Set("current_task", task);
+ callback();
+
+ throw;
+ }
}
void Service::CheckCompletedHandler(const Dictionary::Ptr& scheduleInfo,