Hi again, your code does the subscribe and additionally it puts the subscribe request into the queue. I believe this is to force auto-re-subscribing after the server was away. A better solution is probably to use persistent subscribes in the server as described in
http://www.xmlblaster.org/xmlBlaster/doc/requirements/engine.persistence.subscription.html if the server fails the old susbcriptions are there again, if there was a only temporary network problem no action is needed. With your code all subscriptions are allways queued which may lead to multiple subscriptions after flushing the queue after a network problem when reaching the same server instance again (if not multiple subscribe was switched off in the subscribe QoS). What is you exact problem you wanted to solve, i would need more info to decide if/how to add your code to the distribution. thanks Marcel > pikaiyuan wrote: > >>Hello >> >> I found there has some bug in connectionshandler.cpp like this: >>you are maybe forget to add SubscribeQueueEntry and UnSubscribeQueueEntry >>to ClientQueueProperty, and result in some bugs when program runs in failsafe model. >> It runs correctly after I had made some changes. > > > Hi, > > thanks for reporting, we will look into this issue > for the next release. > > >>1. in subscribe() method >> try { >> SubscribeReturnQos ret = connection_->subscribe(key, qos); >> //add by pky to add subscribe entries to client ram queue >> if (!queue_) { >> if (!connectQos_) { >> throw XmlBlasterException(INTERNAL_SUBSCRIBE, ME + >> "::queuesubscribe", >> "need to create a queue but the connectQos is NULL (probably never >> connected)"); >> } >> if (log_.trace()) log_.trace(ME+":queueSubscribe", "creating a client >> queue ..."); >> queue_ = &QueueFactory::getFactory().getPlugin(global_, >> connectQos_->getClientQueueProperty()); >> log_.info(ME+":queuesubscribe", "created a client queue"); >> } >> if (log_.trace()) >> log_.trace(ME, string("queuesubscribe: entry has been queued")); >> SubscribeQueueEntry entry(global_, key, qos); >> queue_->put(entry); >> //end >> return ret; >> } >> catch (XmlBlasterException& ex) { >> if ( ex.isCommunication() ) toPollingOrDead(&ex); >> throw ex; >> } >> >>2. in unsubscribe() method >> try { >> vector<UnSubscribeReturnQos> ret = connection_->unSubscribe(key, qos); >> //add by pky to add unsubscribe entries to client ram queue >> if (!queue_) { >> if (!connectQos_) { >> throw XmlBlasterException(INTERNAL_UNSUBSCRIBE, ME + >> "::queueunsubscribe", >> "need to create a queue but the connectQos is NULL (probably never >> connected)"); >> } >> if (log_.trace()) log_.trace(ME+":queueunsubscribe", "creating a client >> queue ..."); >> queue_ = &QueueFactory::getFactory().getPlugin(global_, >> connectQos_->getClientQueueProperty()); >> log_.info(ME+":queueunsubscribe", "created a client queue"); >> } >> if (log_.trace()) >> log_.trace(ME, string("queueunsubscribe: entry has been queued")); >> UnSubscribeQueueEntry entry(global_, key, qos); >> queue_->put(entry); >> //end >> return ret; >> } >> catch (XmlBlasterException& ex) { >> if ( ex.isCommunication() ) toPollingOrDead(&ex); >> throw ex; >> } >> >> By the way, does anyone has a look at ptp model in cplusplus client side. > > It should run fine, do you experience any problems? > > best regards, > > Marcel > >>thanks any way >> >> >> pikaiyuan >> 2004-07-01 >> >> > > > -- http://www.xmlBlaster.org
