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.

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.

thanks any way        
                                

                           pikaiyuan
                           2004-07-01      

Reply via email to