class TestWorker(object): def __init__(self, worker_id, thread_num, hostname, port): self.client_id = "%s_test_%d" % (socket.gethostname(), worker_id) self.worker_id = worker_id self.thread_num = thread_num self.hostname = hostname self.port = port self.client = GossipClient(client_id = self.client_id, clean_session = True) self.client.on_connect = self.on_connect self.client.on_disconnect = self.on_disconnect self.client.on_publish = self.on_publish self.client.on_subscribe = self.on_subscribe self.client.on_message = self.on_message self.client.on_unsubscribe = self.on_unsubscribe self.subscribe_done = False def on_connect(self, mosq, obj, rc): if rc == 0: _logger.debug('worker %d connected' % self.worker_id) else: _logger.error('worker %d on_connect, rc=%d' % (self.worker_id, rc)) def on_disconnect(self, mosq, obj, rc): global g_lost_connection_count if rc == 0: _logger.debug('worker %d disconnected normally' % self.worker_id) else: g_lost_connection_count += 1 _logger.error('worker %d lost connection to server' % self.worker_id) if not self.subscribe_done: _logger.error('worker %d not done subscription and lost connection, will retry', self.worker_id) self._do_stuff(self.message_num) def on_publish(self, mosq, obj, mid): return _logger.debug('on worker %d, published mid=%d' % (self.worker_id, mid)) def on_subscribe(self, mosq, obj, mid, qos_list): g_subscribe_done.add(self.worker_id) self.subscribe_done = True #_logger.debug('on worker %d, subscribed mid=%d' % (self.worker_id, mid)) def on_unsubscribe(self, mosq, obj, mid): return _logger.debug('on woker %d, unsubscribed mid=%d' % (self.worker_id, mid)) def on_message(self, mosq, obj, msg): now = time.time() sent = float(msg.payload) elapsed = now - sent self.status.append(elapsed) return _logger.debug('worker %d got message, topic=(%s), payload=(%s)' % (self.worker_id, msg.topic, msg.payload)) def _do_stuff(self, message_num): ret = self.client.connect(self.hostname, self.port, keepalive=6000) if ret != 0: _logger.error("worker %d connect() returned %d" % (self.worker_id, ret)) return self._do_stuff(message_num) topic = "%s-%d" % (socket.gethostname(), self.worker_id) self.subscribe_done = False self.client.subscribe(topic, qos=1) count = 0 while len(self.status) < message_num: count += 1 if count % 100 == 0: _logger.debug("worker %d get %d messages" % (self.worker_id, len(self.status))) ret = self.client.loop() if ret != 0: _logger.error("worker %d loop() failed, returned %d" % (self.worker_id, ret)) return self._do_stuff(message_num) now = time.time() if g_publish_finish_time is not None: late = (now - g_publish_finish_time) if late > 60.0: _logger.debug("worker %d: too long waiting for message, quit with %d received" % (self.worker_id, len(self.status))) return self._do_stuff(message_num) else: _logger.debug("worker %d, %.3f seconds late" % (self.worker_id, late)) g_subscribe_done.add(self.worker_id) self.subscribe_done = True self.client.disconnect() def start_listening(self, message_num): self.status = self._build_status() self.message_num = message_num self._do_stuff(message_num) def _build_status(self): return list() def collect(self): return self.status
class TestWorker(object): def __init__(self, worker_id, thread_num, hostname, port): self.client_id = "%s_test_%d" % (socket.gethostname(), worker_id) self.worker_id = worker_id self.thread_num = thread_num self.hostname = hostname self.port = port self.client = GossipClient(client_id=self.client_id, clean_session=True) self.client.on_connect = self.on_connect self.client.on_disconnect = self.on_disconnect self.client.on_publish = self.on_publish self.client.on_subscribe = self.on_subscribe self.client.on_message = self.on_message self.client.on_unsubscribe = self.on_unsubscribe self.subscribe_done = False def on_connect(self, mosq, obj, rc): if rc == 0: _logger.debug('worker %d connected' % self.worker_id) else: _logger.error('worker %d on_connect, rc=%d' % (self.worker_id, rc)) def on_disconnect(self, mosq, obj, rc): global g_lost_connection_count if rc == 0: _logger.debug('worker %d disconnected normally' % self.worker_id) else: g_lost_connection_count += 1 _logger.error('worker %d lost connection to server' % self.worker_id) if not self.subscribe_done: _logger.error( 'worker %d not done subscription and lost connection, will retry', self.worker_id) self._do_stuff(self.message_num) def on_publish(self, mosq, obj, mid): return _logger.debug('on worker %d, published mid=%d' % (self.worker_id, mid)) def on_subscribe(self, mosq, obj, mid, qos_list): g_subscribe_done.add(self.worker_id) self.subscribe_done = True #_logger.debug('on worker %d, subscribed mid=%d' % (self.worker_id, mid)) def on_unsubscribe(self, mosq, obj, mid): return _logger.debug('on woker %d, unsubscribed mid=%d' % (self.worker_id, mid)) def on_message(self, mosq, obj, msg): now = time.time() sent = float(msg.payload) elapsed = now - sent self.status.append(elapsed) return _logger.debug('worker %d got message, topic=(%s), payload=(%s)' % (self.worker_id, msg.topic, msg.payload)) def _do_stuff(self, message_num): ret = self.client.connect(self.hostname, self.port, keepalive=6000) if ret != 0: _logger.error("worker %d connect() returned %d" % (self.worker_id, ret)) return self._do_stuff(message_num) topic = "%s-%d" % (socket.gethostname(), self.worker_id) self.subscribe_done = False self.client.subscribe(topic, qos=1) count = 0 while len(self.status) < message_num: count += 1 if count % 100 == 0: _logger.debug("worker %d get %d messages" % (self.worker_id, len(self.status))) ret = self.client.loop() if ret != 0: _logger.error("worker %d loop() failed, returned %d" % (self.worker_id, ret)) return self._do_stuff(message_num) now = time.time() if g_publish_finish_time is not None: late = (now - g_publish_finish_time) if late > 60.0: _logger.debug( "worker %d: too long waiting for message, quit with %d received" % (self.worker_id, len(self.status))) return self._do_stuff(message_num) else: _logger.debug("worker %d, %.3f seconds late" % (self.worker_id, late)) g_subscribe_done.add(self.worker_id) self.subscribe_done = True self.client.disconnect() def start_listening(self, message_num): self.status = self._build_status() self.message_num = message_num self._do_stuff(message_num) def _build_status(self): return list() def collect(self): return self.status