修正ActiveMQ C++客户端(CMS)当服务器关闭程序无法退出问题

现在正用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项目即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值