Skip to main content

paquete utilizado para enviar mensajes entre los módulos y el core en un proyecto académico

Project description

sender-python

Descripción

Este es un proyecto académico para la UADE, un paquete que permite la comunicación entre los distintos módulos a través del Core.

Tabla de Contenidos

Changelog

[1.2.1] - 2024-10-22

  • Implementación de métodos para el manejo de Arrays en los mensajes.

[1.2] - 2024-10-21

  • Implementación de headers:
    1. token - para permitir el manejo de la autenticación con JWT.
    2. type - para permitir un mejor manejo de los mensajes al definir el tipo de dato que fue enviado.

Instalación

Para instalar el paquete abrí una terminal en el directorio del proyecto (Shift + Click derecho).. Paso 1

..y escribí:

pip install Squad1CoreSender

Uso

Usá el paquete de la siguiente manera:

  1. Iniciá dos conexiones con el servidor, una será para enviar mensajes y la otra para recibirlos. La conexión te va a pedir especificar un host, un puerto, un usuario y una contraseña. Todos los datos te van a ser dados por el Squad del Core.
  2. Definí una función de callback, o sea lo que va a hacer tu aplicación cada vez que reciba un mensaje. Esto te va a permitir procesarlo. Es importante aclarar que los mensajes viajan en formato de bytes[] así que será necesario usar convert_body().
  3. Iniciá el servicio consumidor dándole una conexión e indicándole cuál es tu módulo, el cual estará restringido por el enum Modules. Es importante aclarar que invocar a esta función bloqueará un hilo de procesamiento para estar permanentemente a la escucha.
  4. Por último, podés usar el método publish para enviar mensajes a cualquier módulo válido. También se encuentra restringido por el enum Modules. Necesitarás ingresar por parámetro una conexión (distinta a la del servicio consumidor), el mensaje en formato String, el nombre del módulo de origen, el de destino y el caso de uso que genera al mensaje. Recomendamos cerrar la conexión usada después de enviar un mensaje, o un lote de ellos, y abrir una nueva cuando vuelva a ser necesaria.

[!CAUTION] ACLARACIONES

  1. Tené en cuenta que la conexión es un objeto del tipo AutoCloseable, por lo que deberías manejar las excepciones e implementar una lógica de reconexión.
  2. Los mensajes pueden ser clases convertidas a un String de formato JSON ó valores sueltos en forma de Plain String. Nuestra recomendación es usar clases, como la vista de ejemplo, para un mejor manejo de la información.
  3. Los tipos de datos son: JSON, String y Array (Es un Stream con forma de Array)

Ejemplo

import json
import os

import sender
from sender import *

from Usuario import Usuario

pool_connections = []

#Abro tantas conexiones como quiera.
for i in range(2):
    pool_connections.append(
        start_connection(
            os.getenv('HOST'),
            os.getenv('PORT'),
            os.getenv('USER'),
            os.getenv('PASSWORD')
        )
    )


def new_callback(ch, method, properties, body):
    #Este sería el JSON que encapsula a los datos enviados desde el módulo de origen.
    message = convert_body(body)

    #Estos serían los datos enviados desde el módulo de origen.
    payload = message.get('payload')

    try:
        #Si los datos pertenecen a una clase podés convertirlos a un objeto genérico de Python.
        usuario = convert_payload(payload)

    except Exception as e:
        pass


#Esta línea es esencial para el funcionamiento del servicio consumidor.
sender.callback = new_callback

#Aqui inicias el consumidor, que se ocupa de leer los mensajes que llegan y responder segun el sender.callback
start_consumer(pool_connections[0], Modules.USUARIO.value)

#Creo un usuario de prueba (es necesario que exista la clase con su función .__init__())
usuario = Usuario(nombre='Matias')

#Convierto el usuario en un String con formato de JSON (es necesario que exista la clase con su método .to_dict())
mensaje = convert_class(usuario)

#Esta es la accion requerida para publicar un elemento a la cola del modulo DESTINO publish(conexion, mensaje, origen, DESTINO, caso de uso, token JWT entregado por Gestion Interna, Tipo de dato del mensaje)
publish(pool_connections[1], mensaje, Modules.USUARIO.value, Modules.USUARIO.value, 'Prueba', token, Types.JSON)

#Cierra la conexion especificada
close_connection(pool_connections[1])

Clase de prueba

class Usuario:
    def __init__(self, nombre):
        self.nombre = nombre

    def to_dict(self):
        return {
            "nombre": self.nombre
        }

[!IMPORTANT] Para versiones mayores a la 1.2.1, en caso de querer trabajar con Arrays, podés usar convert_array() para convertir una lista contenedora de Strings y JSON Strings a un mensaje y convert_string() para la función inversa.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

Squad1CoreSender-1.4.1-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file Squad1CoreSender-1.4.1-py3-none-any.whl.

File metadata

File hashes

Hashes for Squad1CoreSender-1.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bb5aafe27588d4227d9194baa1f49381ef0de2cc96a3ebb9f6e98c060f2686d6
MD5 0739762972ee6a2deb2b8287d6411dbb
BLAKE2b-256 510a4240f8e3ce7e54a2d88bb3802d301c12754d5d0b63d8b519dac51c9f8aad

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page