修正ActiveMQ C++客户端(CMS)当服务器关闭程序无法退出问题
2009-12-02 10:57
447 查看
现在正用ActiveMQ C++客户端开发,发现有个问题,当开始连接ActiveMQ服务器成功后,成功发送数据后,此时ActiveMQ服务器停止,客户端无法退出,出现挂掉现象。
通过调试代码当客户端退出调用如下代码:
try{
if( producer != NULL ) delete producer;
}catch ( CMSException& e ) { e.printStackTrace(); }
producer = NULL;
// Close open resources.
try{
if( session != NULL ) session->close();
if( connection != NULL ) connection->close();
}catch ( CMSException& e ) { e.printStackTrace(); }
try{
if( session != NULL ) delete session;
}catch ( CMSException& e ) { e.printStackTrace(); }
session = NULL;
try{
if( connection != NULL ) delete connection;
}catch ( CMSException& e ) { e.printStackTrace(); }
connection = NULL;
程序报异常,检查代码发现在ActiveMQSession.cpp中,delete producer会调用close方法,然后调用ActiveMQSession::disposeOf方法,而里面会调用this->connection->disposeOf( id );这个过程会发送指令到服务器,在服务器关闭后会抛异常,而没有调用session的this->producers.remove( id ); 在producer的析构函数中,会将所有异常捕获不往外抛,此时proceducer对象被顺利删除,在session的producers中并没有将此producer移除掉,而在session关闭时,会调用ActiveMQSession::close() 方法,在此方法中将所有的producer关掉,而此时会调用到被删除的producer,所以报错。
同理session对connection也有这个情况,在ActiveMQSession::close()方法中,会同样调用this->connection->disposeOf( this->sessionInfo->getSessionId() );让connectio移除session.
所以需要修改代码,在ActiveMQSession.cpp中增加如下代码
#ifdef HHESOCKET_ERROR
#define HHSOCKETERROR_START /
try{
#define HHSOCKETERROR_END /
} /
catch(ActiveMQException& ex) { /
const decaf::io::IOException* exception1 = dynamic_cast<const decaf::io::IOException*>(ex.getCause()); /
if (NULL != exception1) { /
string data = exception1->getMessage(); /
if (NULL == strstr(data.c_str(), "decaf::net::SocketOutputStream::write")) /
throw ex; /
} /
else /
throw ex; /
}
#endif
修改ActiveMQSession::close()方法将this->connection->disposeOf( this->sessionInfo->getSessionId() );改为如下代码:
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_START
#endif
// Remove this session from the Broker.
this->connection->disposeOf( this->sessionInfo->getSessionId() );
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_END
#endif
修改ActiveMQSession::disposeOf( Pointer<ProducerId> id )方法,将this->connection->disposeOf( id );改为如下代码:
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_START
#endif
this->connection->disposeOf( id );
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_END
#endif
修改ActiveMQSession::disposeOf( Pointer<CustomerId> id )方法,将this->connection->disposeOf( id );也改为如上代码
在项目中添加HHESOCKET_ERROR预定义宏,重新编译activemq项目即可
通过调试代码当客户端退出调用如下代码:
try{
if( producer != NULL ) delete producer;
}catch ( CMSException& e ) { e.printStackTrace(); }
producer = NULL;
// Close open resources.
try{
if( session != NULL ) session->close();
if( connection != NULL ) connection->close();
}catch ( CMSException& e ) { e.printStackTrace(); }
try{
if( session != NULL ) delete session;
}catch ( CMSException& e ) { e.printStackTrace(); }
session = NULL;
try{
if( connection != NULL ) delete connection;
}catch ( CMSException& e ) { e.printStackTrace(); }
connection = NULL;
程序报异常,检查代码发现在ActiveMQSession.cpp中,delete producer会调用close方法,然后调用ActiveMQSession::disposeOf方法,而里面会调用this->connection->disposeOf( id );这个过程会发送指令到服务器,在服务器关闭后会抛异常,而没有调用session的this->producers.remove( id ); 在producer的析构函数中,会将所有异常捕获不往外抛,此时proceducer对象被顺利删除,在session的producers中并没有将此producer移除掉,而在session关闭时,会调用ActiveMQSession::close() 方法,在此方法中将所有的producer关掉,而此时会调用到被删除的producer,所以报错。
同理session对connection也有这个情况,在ActiveMQSession::close()方法中,会同样调用this->connection->disposeOf( this->sessionInfo->getSessionId() );让connectio移除session.
所以需要修改代码,在ActiveMQSession.cpp中增加如下代码
#ifdef HHESOCKET_ERROR
#define HHSOCKETERROR_START /
try{
#define HHSOCKETERROR_END /
} /
catch(ActiveMQException& ex) { /
const decaf::io::IOException* exception1 = dynamic_cast<const decaf::io::IOException*>(ex.getCause()); /
if (NULL != exception1) { /
string data = exception1->getMessage(); /
if (NULL == strstr(data.c_str(), "decaf::net::SocketOutputStream::write")) /
throw ex; /
} /
else /
throw ex; /
}
#endif
修改ActiveMQSession::close()方法将this->connection->disposeOf( this->sessionInfo->getSessionId() );改为如下代码:
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_START
#endif
// Remove this session from the Broker.
this->connection->disposeOf( this->sessionInfo->getSessionId() );
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_END
#endif
修改ActiveMQSession::disposeOf( Pointer<ProducerId> id )方法,将this->connection->disposeOf( id );改为如下代码:
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_START
#endif
this->connection->disposeOf( id );
#ifdef HHESOCKET_ERROR
HHSOCKETERROR_END
#endif
修改ActiveMQSession::disposeOf( Pointer<CustomerId> id )方法,将this->connection->disposeOf( id );也改为如上代码
在项目中添加HHESOCKET_ERROR预定义宏,重新编译activemq项目即可
相关文章推荐
- ActiveMQ-cpp客户端程序应用异常退出问题
- 关于程序退出无法关闭所有界面问题 通过广播使Android程序完全退出
- 解决连接vcenter (客户端无法向服务器发送完整的请求。(基础连接已经关闭:发送时发生错误。)) 问题
- 解决虚拟键盘关闭后无法退出程序的问题
- “Visual Studio .NET 无法创建或打开应用程序。问题很可能是因为本地WEB本地服务器上没有安装所需的组件。请运行Visual Studio .NET安装程序并添加WEB开发组件“的一种解决方案
- C++程序一闪就关闭的问题解决
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Androin学习笔记四十四:android下socket编程问题:服务器关闭时,客户端发送请求的异常处理
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- SVN客户端无法连接服务器的问题
- apache服务器:无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (三)用TClientDataSet的“ProviderName”属性连接服务器时,无法找到服务器端的“DatasetProvier”
- JAVA NIO导致JAVA服务端程序无法关闭的奇怪问题
- android 退出程序关闭死循环线程的一种方法(开源中国客户端下载APK疑问总结)
- 解决FTP客户端文件断点续传过程中服务器无法知晓文件总大小的问题
- 由一个论坛帖子, 解决udp 服务器无法返回数据给第一个客户端的问题
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Dev-C++ IDE 运行程序时,程序运行结束窗口自动关闭的问题