设计应用程序有哪些方法可以在不需要重启应用程序的情况下更改配置?
一种方法是只使用带有配置的平面文件,然后应用程序在需要特定值时从配置中读取,并且永远不会将任何配置值存储在内存中。
另一种选择是允许应用程序加载配置文件一次并将值存储在内存中,但是如果发生更改,则定期重新加载配置文件。
答案 0 :(得分:1)
恰巧我最近更新了我的一个免费软件包来做到这一点。我采取的方法略有不同。
1)我的应用程序加载其配置,解析它并将其存储在内存中。每次应用程序需要某些配置设置的值时,我都不会读取配置设置。
2)但是,除了配置设置外,我还存储了配置文件本身的时间戳。
3)当应用程序响应事件而唤醒时,它有事可做,它会检查配置文件的时间戳。如果没有改变,则不采取进一步行动。 stat(2)系统调用是轻量级,便宜且快速的,并且增加了很少的开销。
4)如果stat(2)
告诉我配置文件的时间戳已更改,则应用程序会再次读取配置文件。
配置文件作为其格式的一部分,包括一个明确的配置结束"标记。如果我的应用程序没有看到它,这意味着我应该出去玩下一个彩票,因为我设法达到极其罕见的竞争条件,在这种情况下,当我的应用程序以某种方式结束读取新的配置文件我正在使用编辑器保存的同时编辑配置文件!
如果代码没有看到"配置结束"标记,在下次应用程序唤醒并检查配置文件的时间戳之前不会采取进一步操作。
5)读取并解析新配置文件后,我验证新的配置设置。这里进行了一些内部的健全性检查。如果完整性检查失败,则在将错误报告给系统日志后不会采取进一步操作。
6)只有在完整性检查通过后,先前存储的配置设置和值才会被从新配置文件中读取的更新值以及新配置文件的新时间戳替换。直到下次我们再见面。
P.S。保存的配置设置受互斥锁保护。当应用程序需要检查特定配置设置的值时,应用程序将保留互斥锁。步骤6还会获取足够长的互斥锁,以使用新验证的更新配置设置替换当前配置设置。
答案 1 :(得分:0)
要避免轮询,请考虑使用操作系统发出的通知来查找配置文件的修改时间。大多数操作系统都提供了可以执行此操作的API:
答案 2 :(得分:0)
Sam Varshavchik的回答包含许多好建议。但是,还有其他一点值得陈述......
配置类的公共API将提供一个或多个用于检索配置值的lookup()
样式方法。为确保线程安全,必须确保这些lookup()
方法返回基础配置值的深层副本(而不是指针/引用)。例如,如果返回一个字符串,则返回类型应为std::string
而不是const std::string &
或const char *
。