def publish(self):
     try:
         if (len(self.metricList) > 0) or MetricCache:
             if len(self.metricList) < NUM_of_PUBLISHES_per_CONNECTION :
                 for (metric, datapoints) in self.getMetrics():
                     if(len(metric)>255):
                         log.amqpPublisher("Dropped metric  %s as it is too long"%(metric))
                         continue  
                     self.metricList.append((metric, datapoints))
                     if len(self.metricList) >= NUM_of_PUBLISHES_per_CONNECTION :
                         break  
             d = writeMetric(self.metricList, settings.AMQP_PUB_HOST, settings.AMQP_PUB_PORT, settings.AMQP_PUB_USER, settings.AMQP_PUB_PASSWORD, settings.AMQP_PUB_VHOST, settings.AMQP_PUB_EXCHANGE, settings.AMQP_PUB_QUEUE)                    
             d.addCallbacks(self.successful, self.tryAgain)
             d.addBoth(self.nextCall) 
             
         else: 
             reactor.callLater(10, self.publish)
     except:
         reactor.callLater(15, self.publish) 
 def tryAgain(self,_):
     log.amqpPublisher("Failed to publish %d (metric, datapoints) tuples"%(len(self.metricList)))
     try: 
         yield conn.close("Closing Connection")
         log.amqpPublisher("Closing connection after failing to publish")
     except Exception, e:
         log.amqpPublisher("Error in closing connection: %s"%(repr(e))) 
 def successful(self,_):
     log.amqpPublisher("Completed publishing %d (metric, datapoints) tuples"%(len(self.metricList)))
     self.metricList = []