- 浏览: 229464 次
最新评论
-
Poechant:
zx246212 写道LZ写的好哇,再问个,GC一般选取多少个 ...
JVM 深入笔记(3)垃圾标记算法 -
zx246212:
LZ写的好哇,再问个,GC一般选取多少个基类呢?如果一个大的项 ...
JVM 深入笔记(3)垃圾标记算法 -
yljf1314:
高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例
ServerApplication 对其子类有如下要求: Application 对其子类的要求是,如下这些成员函数必须被覆盖: 设定日志级别(0 - 8,默认是 6,表示 info 级别)。 其他一些选项: 显示帮助信息的选项: 当需要显示帮助信息时,调用如下函数: 参数是选项名和选项值。 如果选项是帮助: 如果是 如果选项是 如果选项是 如果选项是 先加一个作用域锁,然后再向日志流写数据。 调用 manageLogFile,主要做一些日志大小超出限制的处理。 先判断是否超过日志文件的大小上线, 打开新日志文件: 如果该文件已经存在,则先删除: 在 作用域锁: 如果是命令行交互模式(即不是 daemon 模式): 向日志流输出一句日志: 日志文件的善后处理(主要处理文件大小限制可能产生的问题): - 转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant -OpenRTMFP/Cumulus Primer(5)CumulusServer启动流程分析(续)
1 CumulusServer 是 ServerApplication 的子类
2 ServerApplication 是 Application 的子类
3 反初始化
CumulusServer
是继承ServerApplication
的,ServerApplication
是继承Application
的。Application
的run()
函数会先调用initialize()
,然后调用main()
,最后调用uninitialize
。最后这个反初始化过程,在CumulusServer
就是直接调用父类的uninitialize
函数。void uninitialize() {
ServerApplication::uninitialize();
}
4 命令行选项设定
CumulusServer
的命令行选项有:log
(l)、dump
(d)、cirrus
(c)、middle
(m)、help
(h)。void defineOptions(OptionSet& options) {
ServerApplication::defineOptions(options);
options.addOption(
Option("log", "l", "Log level argument, must be beetween 0 and 8 : \
nothing, fatal, critic, error, warn, note, info, debug, trace. \
Default value is 6 (info), all logs until info level are displayed.")
.required(false)
.argument("level")
.repeatable(false));
options.addOption(
Option("dump", "d", "Enables packet traces in logs. Optional arguments \
are 'middle' or 'all' respectively to displays just middle packet \
process or all packet process. If no argument is given, just outside \
packet process will be dumped.",false,"middle|all",false)
.repeatable(false));
options.addOption(
Option("cirrus", "c", "Cirrus address to activate a 'man-in-the-middle' \
developer mode in bypassing flash packets to the official cirrus \
server of your choice, it's a instable mode to help Cumulus developers, \
\"p2p.rtmfp.net:10000\" for example. By adding the 'dump' argument, \
you will able to display Cirrus/Flash packet exchange in your logs \
(see 'dump' argument).",false,"address",true)
.repeatable(false));
options.addOption(
Option("middle", "m","Enables a 'man-in-the-middle' developer mode \
between two peers. It's a instable mode to help Cumulus developers. \
By adding the 'dump' argument, you will able to display Flash/Flash \
packet exchange in your logs (see 'dump' argument).")
.repeatable(false));
options.addOption(
Option("help", "h", "Displays help information about command-line usage.")
.required(false)
.repeatable(false));
}
OptionSet
是Poco::Util::OptionSet
,调用addOption
可以向其中增加选项Option
。其中required
和repeatable
表示:
void displayHelp() {
HelpFormatter helpFormatter(options());
helpFormatter.setCommand(commandName());
helpFormatter.setUsage("OPTIONS");
helpFormatter.setHeader("CumulusServer, open source RTMFP server");
helpFormatter.format(cout);
}
5 处理命令行选项
void handleOption(const std::string& name, const std::string& value) {
ServerApplication::handleOption(name, value);
if (name == "help")
_helpRequested = true;
cirrus
,即该服务的 IP 和端口号,Poco::URI 中有协议名(Scheme)、IP 地址(Host)、端口号(Port)、查询串(Query)等等。 else if (name == "cirrus") {
try {
URI uri("rtmfp://"+value);
_pCirrus = new SocketAddress(uri.getHost(),uri.getPort());
NOTE("Mode 'man in the middle' : the exchange will bypass to '%s'",value.c_str());
} catch(Exception& ex) {
ERROR("Mode 'man in the middle' error : %s",ex.message().c_str());
}
dump
日志: } else if (name == "dump") {
if(value == "all")
Logs::SetDump(Logs::ALL);
else if(value == "middle")
Logs::SetDump(Logs::MIDDLE);
else
Logs::SetDump(Logs::EXTERNAL);
middle
: } else if (name == "middle")
_middle = true;
log
,表示设定日志级别: else if (name == "log")
Logs::SetLevel(atoi(value.c_str()));
}
6 Dump logs
void dumpHandler(const UInt8* data,UInt32 size) {
ScopedLock<FastMutex> lock(_logMutex);
cout.write((const char*)data, size);
_logStream.write((const char*)data,size);
manageLogFile();
}
void manageLogFile() {
LOG_SIZE
是1000000
字节(即约 1 MB)。 if(_pLogFile->getSize() > LOG_SIZE) {
_logStream.close();
int num = 10;
File file(_logPath + "10");
if (file.exists())
file.remove();
while (--num >= 0) {
file = _logPath + NumberFormatter::format(num);
if (file.exists())
file.renameTo(_logPath + NumberFormatter::format(num + 1));
}
_logStream.open(_pLogFile->path(), ios::in | ios::ate);
}
}
7 停止运行
CumulusServer
继承了ApplicationKiller
,该类中有纯虚函数kill()
需要被实现,于是有:void kill() {
terminate();
}
ApplicationKiller
的定义在ApplicationKiller.h
中,如下:class ApplicationKiller {
public:
ApplicationKiller(){}
virtual ~ApplicationKiller(){}
virtual void kill()=0;
};
8 载入配置
initialize()
函数中调用,上一篇已提到过。void loadConfiguration(const string& path) {
try {
ServerApplication::loadConfiguration(path);
} catch(...) {
}
}
9 处理日志
void logHandler(Thread::TID threadId,
const std::string& threadName,
Priority priority,
const char *filePath,
long line,
const char *text) {
ScopedLock<FastMutex> lock(_logMutex);
Path path(filePath);
string file;
if (path.getExtension() == "lua")
file += path.directory(path.depth()-1) + "/";
if (_isInteractive)
printf("%s %s[%ld] %s\n",
g_logPriorities[priority - 1],
(file + path.getBaseName()).c_str(),
line,
text);
_logStream << DateTimeFormatter::format(LocalDateTime(),"%d/%m %H:%M:%S.%c ")
<< g_logPriorities[priority-1]
<< '\t' << threadName
<< '(' << threadId << ")\t"
<< (file + path.getFileName())
<< '[' << line << "] "
<< text << std::endl;
_logStream.flush();
manageLogFile();
}
发表评论
-
OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片
2012-08-05 18:58 1156OpenRTMFP/Cumulus Primer(13) ... -
OpenRTMFP/Cumulus Primer(12)IO管理之IO流(续)
2012-08-05 12:49 1030OpenRTMFP/Cumulus Primer(12) ... -
OpenRTMFP/Cumulus Primer(11)IO管理之IO流
2012-08-05 12:47 937OpenRTMFP/Cumulus Primer(11) ... -
OpenRTMFP/Cumulus Primer(10)IO 管理之流缓冲区
2012-08-05 03:00 3839OpenRTMFP/Cumulus Primer(10) ... -
OpenRTMFP/Cumulus Primer(9)AMF 处理方式解析——BinaryReader/Writer
2012-08-05 02:59 1495OpenRTMFP/Cumulus Primer(9 ... -
OpenRTMFP/Cumulus Primer(8)CumulusServer主进程主循环分析
2012-08-02 10:27 1021OpenRTMFP/Cumulus Primer(8)C ... -
OpenRTMFP/Cumulus Primer(7)CumulusServer 启动流程分析(续3)
2012-08-02 10:26 1038OpenRTMFP/Cumulus Primer(7)C ... -
OpenRTMFP/Cumulus Primer(6)CumulusServer启动流程分析(续2)
2012-08-02 10:25 1172OpenRTMFP/Cumulus Primer(6)C ... -
OpenRTMFP/Cumulus Primer(4)CumulusServer启动流程分析
2012-04-25 22:11 1352OpenRTMFP/Cumulus Primer(4 ... -
OpenRTMFP/Cumulus Primer(3)图解CumulusEdge原理
2012-04-14 16:42 1843OpenRTMFP/Cumulus Primer(3) ... -
OpenRTMFP/Cumulus Primer(2)用Lua编写HelloWorld应用扩展CumulusServer
2012-04-14 02:59 2296OpenRTMFP/Cumulus Primer(2)用Lua ... -
OpenRTMFP/Cumulus Primer(1)入门介绍与部署CumulusServer
2012-04-14 02:57 3539OpenRTMFP/Cumulus Primer(1) ...
相关推荐
《OpenRTMFP Cumulus Primer 入门与CumulusServer部署》 OpenRTMFP (Real Time Media Flow Protocol) 是一种技术,它为Flash实时应用提供了高并发扩展能力。OpenRTMFP/Cumulus是基于GNU General Public License的...
openrtmfp又名Cumulus Server是一个完全开源和跨平台的可扩展的RTMFP服务器脚本。Cumulus Server在GPL 框架下遵循速度、优势、跨平台、轻量和高质量代码。Cumulus Server的每一个版本都是通过严格测试和审核的。可...
5. **VXLAN支持**:VXLAN(Virtual eXtensible Local Area Network)是网络虚拟化的一种技术,Cumulus Linux 4.4.0 支持VXLAN,允许在网络中创建多个独立的虚拟网络,增强了网络的隔离性和扩展性。 6. **QEMU虚拟化...
Cumulus可能是基于Web的项目管理工具或者数据分析平台,而`swfobject.js`和`tagcloud.swf`这两个文件名暗示了它可能与Flash交互和数据可视化有关。 `swfobject.js`是一个JavaScript库,主要用于在网页中嵌入Adobe ...
本教程将深入探讨如何使用Lua语言来扩展CumulusServer,一个基于OpenRTMFP协议的服务器平台。通过这个"HelloWorld"应用,我们将了解Lua在服务端开发中的应用,以及它与CumulusServer的集成方式。 首先,Lua是一种轻...
高性能计算云 目标 ...$ vi /opt/hpccloud/cumulus/cumulus/conf/config.json +- > Fix host to be localhost +- > baseUrl: " http://localhost:8080/api/v1 " , $ sudo service celeryd restar
这本食谱在 vanilla Debian 上创建了一个交换机覆盖,并且还部署在 Cumulus 路由器/交换机上。 要求 测试 访问 Debian Wheezy 盒子 生产 访问 Cumulus HCL [1] 开关(Accton AS6701_32X,这就是这本食谱最初的目的)...
2. **易用性**:尽管拥有丰富的自定义选项,但`wp-cumulus`的基本安装和使用过程相当简单,适合新手和专业人士。 3. **多语言支持**:除了英文,`wp-cumulus`对中文的支持使得它在全球范围内具有更广泛的适用性。 ...
5. **错误处理和恢复**:如果在传输过程中出现错误,如网络中断,Cumulus会尝试恢复连接或者重新建立P2P链路。 6. **断开连接**:当通信结束时,客户端会关闭P2P连接,释放资源。 通过这样的机制,Flex P2P 音视频...
在使用过程中,确保你的网站已经安装了Flash插件,因为"wp-cumulus" 在运行时需要依赖Flash支持。不过,随着HTML5技术的发展,一些现代版本可能提供了HTML5替代方案,以便在不支持Flash的设备上也能正常显示。 总的...
5. **性能评估**:为了验证Cumulus 的性能,研究人员进行了实验比较,包括模拟网络环境下的数据恢复速度、存储效率和网络带宽利用率。实验结果表明,Cumulus 在保持或提高容错性的同时,显著降低了网络负载,并提升...
《WordPress中的wp-cumulus 3D云标签详解》 在WordPress这个强大的开源博客平台中,wp-cumulus是一款极具特色的3D云标签插件。它以其独特的视觉效果和交互体验,为用户提供了全新的标签展示方式,使得博客的分类和...
这里给出了cumulus/OpenRTMFP的git官网提到的视频会话样例的AS3代码,包括服务器端和客户端两部分,我已经在<使用Cumulus和Flash Player搭建视频会议示例>http://blog.csdn.net/tao_627/article/details/18041473中给...
积云Cumulus 是的免费、开源替代品,它利用您自己的 S3 进行存储。下载您可以在下载最新版本更改默认截图目录这是可选的。 默认情况下,OS X 会将屏幕截图放在您的桌面上。 但是,如果您希望他们去其他地方,您可以...
积云框架 :open_book: 文献资料 最新文档。 文档。 更多信息 有关此项目的更多信息,以及有关NASA的地球观测系统数据和信息系统(EOSDIS)及其云工作的更多信息,请联系或访问 。...这是用于Cumulus开
大名鼎鼎的WP-CUMULUS 3D标签云,已经改成支持中文标签,可在.htm自行添加标签链接,可以单机玩耍测试,不需要安装WordPress然后装插件~~ 主要是有些童鞋只是想要3D标签云动画,所以就提取重要文件出来稍作修改下.
【标题】"wp-cumulus.rar" 是一个与WordPress相关的压缩包,其中包含"TagCloud._TagCloud.as",这表明它与创建和展示WordPress标签云的插件有关。"flex cumul_wp cumulus_wp cu"暗示这个插件可能是用Adobe Flex技术...
Cumulus集成测试项目[已弃用] 注意:此存储库不再维护。 该存储库的内容已移至。 什么是积云? Cumulus是NASA未来地球科学数据流的基于云的数据提取,存档,分发和管理原型。 阅读 安装 nvm use npm install 在...
Mellanox Cumulus学习,基本使用,培训资源
或者,它可能包含了一些数据处理和分析的工具,帮助开发者快速处理大量数据。 Python库的版本管理也非常重要。版本号1.1.0意味着这是一个相对稳定的版本,相较于早期版本,它可能修复了一些已知问题,增加了新功能...