def _sendAck(self, obj): buff = struct.pack('!I%ds' % (len(obj['idMessage']),), len(obj['idMessage']), obj['idMessage']) try: obj['socket'].send(buff) except Exception as ex: loggerManager.get_endPoints_logger().error("Error al enviar el ACK %s" % ex.message) raise ex finally: del buff
def _processMessage(self, message, obj): try: msg = self._compressor.decompress(message) self.__invokeOnMessageReceived(msg) if self._useAck: self._sendAck(obj) except Exception as ex: loggerManager.get_endPoints_logger().error("Error al procesar el mensaje: %s" % ex) raise ex
def _processMessage(self, message, obj): try: msg = self._compressor.decompress(message) self.__invokeOnMessageReceived(msg) if self._useAck: self._sendAck(obj) except Exception as ex: loggerManager.get_endPoints_logger().error( "Error al procesar el mensaje: %s" % ex) raise ex
def _close_point(self): try: self._socket.shutdown(socket.SHUT_RDWR) self._socket.close() except Exception as ex: loggerManager.get_endPoints_logger().error( "Error al desconectar del host %s:%i : %s" % (self._server, self._port, ex.message)) finally: del self._socket self._socket = None
def _connect_point(self): try: self._create_socket() self._socket.bind((self._server, self._port)) self._socket.listen(self._maxConnectionRequests) except Exception as ex: loggerManager.get_endPoints_logger().error( "Error al conectar con el host %s:%i" % (self._server, self._port)) loggerManager.get_endPoints_logger().error("Socket de mierda: %s" % self._socket.fileno) raise ConnectionError(ex)
def _sendAck(self, obj): buff = struct.pack('!I%ds' % (len(obj['idMessage']), ), len(obj['idMessage']), obj['idMessage']) try: obj['socket'].send(buff) except Exception as ex: loggerManager.get_endPoints_logger().error( "Error al enviar el ACK %s" % ex.message) raise ex finally: del buff
def _send(self, message): try: messageProperties = pika.BasicProperties(content_type='text/plain', delivery_mode=1, content_encoding='utf-8') return self._channel.basic_publish(exchange= self._exchange, routing_key= self._key, body= unicode(message).encode('utf-8'), properties= messageProperties) except ConnectionClosed as ex: loggerManager.get_endPoints_logger().error("Error: %s" % ex) raise ConnectionError("Se ha perdido la conexcion con el servidor AMPQ") except Exception as ex: loggerManager.get_endPoints_logger().error("Error: %s" % ex) raise SendError('Error al enviar el elemento %s' % ex)
def _startReceive(self): try: loggerManager.get_endPoints_logger().debug("Aceptando conexiones") (clientSocket, address) = self._socket.accept() loggerManager.get_endPoints_logger().info("Conexion establecida con el cliente %s:%i." % (address[0], address[1])) th = threading.Thread(target=InBoundChannelTcp.__readData, args=(self, clientSocket), name="TCP client %s:%i" % (address[0], address[1])) loggerManager.get_endPoints_logger().debug('Iniciando hilo de lectura %s' % th.getName()) th.start() except socket.timeout as ex: loggerManager.get_endPoints_logger().debug("Timeout de aceptacion de conexiones : %s." % ex.message) pass except Exception as ex: loggerManager.get_endPoints_logger().error("Error al aceptar conexiones : %s." % ex.message) raise ex
def _reconnect(self): # Si ya esta conectado no reconecta if self._isConnected: return self._reconnectionNumber = 0 self._reconnectionTimer.reset() self._isConnected = False while True: try: loggerManager.get_endPoints_logger().debug( "Conectando al host: %s", self._host) self._connect_point() break except ConnectionError as ex: loggerManager.get_endPoints_logger().error( "Error al conectar: %s" % ex) if self._maxReconnections != Channel.INFINITE_RECONNECTIONS and self._reconnectionNumber >= self._maxReconnections: loggerManager.get_endPoints_logger().error( "Se ha alcanzado el maximo numero de reconexiones") raise ConnectionError( "Se ha alcanzado el maximo numero de reconexiones") else: loggerManager.get_endPoints_logger().error( "Intentado reconectar... %d" % self._reconnectionNumber) self._reconnectionNumber += 1 self._reconnectionTimer.wait() self._isConnected = True
def _send(self, message): try: messageProperties = pika.BasicProperties(content_type='text/plain', delivery_mode=1, content_encoding='utf-8') return self._channel.basic_publish( exchange=self._exchange, routing_key=self._key, body=unicode(message).encode('utf-8'), properties=messageProperties) except ConnectionClosed as ex: loggerManager.get_endPoints_logger().error("Error: %s" % ex) raise ConnectionError( "Se ha perdido la conexcion con el servidor AMPQ") except Exception as ex: loggerManager.get_endPoints_logger().error("Error: %s" % ex) raise SendError('Error al enviar el elemento %s' % ex)
def __workReceive(self): while True: try: if self.isRunning: self._startReceive() else: self._stopReceive() break except Exception as ex: # Intentamos reconectar try: loggerManager.get_endPoints_logger().error("Error en la recepcion de mensajes %s" % ex) self.close() self._reconnect() except ConnectionError: self.stop() self._invokeOnConnectionError() break
def __workReceive(self): while True: try: if self.isRunning: self._startReceive() else: self._stopReceive() break except Exception as ex: # Intentamos reconectar try: loggerManager.get_endPoints_logger().error( "Error en la recepcion de mensajes %s" % ex) self.close() self._reconnect() except ConnectionError: self.stop() self._invokeOnConnectionError() break
def send(self, message): ret = True self._mutex.acquire() while True: try: #loggerManager.get_endPoints_logger().debug("Enviando mensaje %s" % message) msg = self._compressor.compress(message) ret = self._send(msg) if not ret: ret = self.__checkMessageSent(message) else: self._invokeOnMessageSent(message) del msg break except ConnectionError as ex: loggerManager.get_endPoints_logger().error("Error de conexion al enviar el mensaje %s" % ex) # Intentamos reconectar try: self.close() self._reconnect() except ConnectionError as ex2: loggerManager.get_endPoints_logger().error( "No se ha podido reconectar al enviar el mensaje %s" % ex2) self._invokeOnSendError(message) break except SendError as ex: loggerManager.get_endPoints_logger().error("Error de envio %s" % ex) self._invokeOnSendError(message) break except Exception: raise self._mutex.release() return ret
def _startReceive(self): try: loggerManager.get_endPoints_logger().debug("Aceptando conexiones") (clientSocket, address) = self._socket.accept() loggerManager.get_endPoints_logger().info( "Conexion establecida con el cliente %s:%i." % (address[0], address[1])) th = threading.Thread(target=InBoundChannelTcp.__readData, args=(self, clientSocket), name="TCP client %s:%i" % (address[0], address[1])) loggerManager.get_endPoints_logger().debug( 'Iniciando hilo de lectura %s' % th.getName()) th.start() except socket.timeout as ex: loggerManager.get_endPoints_logger().debug( "Timeout de aceptacion de conexiones : %s." % ex.message) pass except Exception as ex: loggerManager.get_endPoints_logger().error( "Error al aceptar conexiones : %s." % ex.message) raise ex
def _reconnect(self): # Si ya esta conectado no reconecta if self._isConnected: return self._reconnectionNumber = 0 self._reconnectionTimer.reset() self._isConnected = False while True: try: loggerManager.get_endPoints_logger().debug("Conectando al host: %s", self._host) self._connect_point() break except ConnectionError as ex: loggerManager.get_endPoints_logger().error("Error al conectar: %s" % ex) if self._maxReconnections != Channel.INFINITE_RECONNECTIONS and self._reconnectionNumber >= self._maxReconnections: loggerManager.get_endPoints_logger().error("Se ha alcanzado el maximo numero de reconexiones") raise ConnectionError("Se ha alcanzado el maximo numero de reconexiones") else: loggerManager.get_endPoints_logger().error("Intentado reconectar... %d" % self._reconnectionNumber) self._reconnectionNumber += 1 self._reconnectionTimer.wait() self._isConnected = True
def send(self, message): ret = True self._mutex.acquire() while True: try: #loggerManager.get_endPoints_logger().debug("Enviando mensaje %s" % message) msg = self._compressor.compress(message) ret = self._send(msg) if not ret: ret = self.__checkMessageSent(message) else: self._invokeOnMessageSent(message) del msg break except ConnectionError as ex: loggerManager.get_endPoints_logger().error( "Error de conexion al enviar el mensaje %s" % ex) # Intentamos reconectar try: self.close() self._reconnect() except ConnectionError as ex2: loggerManager.get_endPoints_logger().error( "No se ha podido reconectar al enviar el mensaje %s" % ex2) self._invokeOnSendError(message) break except SendError as ex: loggerManager.get_endPoints_logger().error( "Error de envio %s" % ex) self._invokeOnSendError(message) break except Exception: raise self._mutex.release() return ret
def __readData(self, clientSocket): clientSocket.settimeout(self.__receptionTimeout) while self.isRunning: try: loggerManager.get_endPoints_logger().debug( "Leyendo mensaje...") message = '' idMessage = '' messageLength = 0 bytesReceived = '' bytesReceived = clientSocket.recv(4) if not len(bytesReceived) == 4: raise Exception("Error al leer cabecera") loggerManager.get_endPoints_logger().debug("Cabecera leida.") messageLength = struct.unpack('>I', bytesReceived)[0] message = clientSocket.recv(messageLength) if not len(message) == messageLength: raise Exception( "Error de longitud del mensaje : Expected length %s - Actual length %i" % (messageLength, len(message))) # TODO: Esto tiene que ir en la clase superior idMessage = clientSocket.recv(36) if not len(idMessage) == 36: raise Exception( "Error de identificacion del mensaje : Msg length %i - Msg Id length %i" % (len(message), len(idMessage))) self._processMessage(message, { "idMessage": idMessage, "socket": clientSocket }) except socket.timeout as ex: loggerManager.get_endPoints_logger().error( "Error de recepcion : %s." % ex.message) break except socket.error as ex: loggerManager.get_endPoints_logger().error( "Error de socket : %s." % ex.message) break except Exception as ex: loggerManager.get_endPoints_logger().error(ex.message) break finally: del message, bytesReceived, messageLength, idMessage try: clientSocket.shutdown(socket.SHUT_RDWR) clientSocket.close() except Exception as ex: loggerManager.get_endPoints_logger().error( "Error al desconectar del cliente : %s" % ex.message) finally: del clientSocket clientSocket = None
def __readData(self, clientSocket): clientSocket.settimeout(self.__receptionTimeout) while self.isRunning: try: loggerManager.get_endPoints_logger().debug("Leyendo mensaje...") message = '' idMessage = '' messageLength = 0 bytesReceived = '' bytesReceived = clientSocket.recv(4) if not len(bytesReceived) == 4: raise Exception("Error al leer cabecera") loggerManager.get_endPoints_logger().debug("Cabecera leida.") messageLength = struct.unpack('>I', bytesReceived)[0] message = clientSocket.recv(messageLength) if not len(message) == messageLength: raise Exception("Error de longitud del mensaje : Expected length %s - Actual length %i" % (messageLength, len(message))) # TODO: Esto tiene que ir en la clase superior idMessage = clientSocket.recv(36) if not len(idMessage) == 36: raise Exception("Error de identificacion del mensaje : Msg length %i - Msg Id length %i" % (len(message), len(idMessage))) self._processMessage(message, { "idMessage" : idMessage, "socket" : clientSocket} ) except socket.timeout as ex: loggerManager.get_endPoints_logger().error("Error de recepcion : %s." % ex.message) break except socket.error as ex: loggerManager.get_endPoints_logger().error("Error de socket : %s." % ex.message) break except Exception as ex: loggerManager.get_endPoints_logger().error(ex.message) break finally: del message, bytesReceived, messageLength, idMessage try: clientSocket.shutdown(socket.SHUT_RDWR) clientSocket.close() except Exception as ex: loggerManager.get_endPoints_logger().error("Error al desconectar del cliente : %s" % ex.message) finally: del clientSocket clientSocket = None