笔者使用ActiveMQ作为系统中消息分发的服务器,由Java Web程序读取数据库实时记录作为Producer,接收端为C++Builder开发的客户端程序,常驻客户端右下角,弹窗显示实时消息。
测试时发现,当客户端断网(网线拔掉)或者服务器重启等连接中断时,客户端会直接退出,windows也没有报程序崩溃的问题,很是费解。
Debug调试代码发现问题出在自定义的Concumer类的异常处理时,调用了exit(1);
//SimpleAsyncConsumer.cpp 【1】
void SimpleAsyncConsumer::onException( const CMSException& ex AMQCPP_UNUSED )
{
printf("CMS Exception occurred. Shutting down client.\n");
exit(1);
}
注释掉exit(1)后问题解决,客户端不会再异常退出了。不过拔掉网线测试时,客户端不能检测到与服务器连接已断开的状态,笔者采用在SimpleAsyncConsumer类中添加状态变量的方式。
void SimpleAsyncConsumer::onException( const CMSException& ex AMQCPP_UNUSED )
{
printf("CMS Exception occurred. Shutting down client.\n");
connflag= false;
}
上层调用程序实时检测连接状态,检测到false时释放资源,等待重新连接。
【1】引用:http://blog.sina.com.cn/s/blog_a459dcf501017ooh.html 邵明博客ActiveMQ完整的C++客户端例子(源码) ,文中使用的客户端concumer参见此文。