Saltar al contenido

¿Cómo puedo poner en cola una tarea para Celery desde C#?

Te recomendamos que revises esta resolución en un entorno controlado antes de enviarlo a producción, un saludo.

Solución:

No sé si la pregunta sigue siendo relevante, pero espero que la respuesta ayude a otros.

Así es como logré imponer una tarea al trabajador de ejemplo de Celery.

  1. Deberá establecer una conexión entre su productor (cliente) y RabbitMQ como se describe aquí.

        ConnectionFactory factory = new ConnectionFactory();
        factory.UserName = username;
        factory.Password = password;
        factory.VirtualHost = virtualhost;
        factory.HostName = hostname;
        factory.Port = port;
    
        IConnection connection = factory.CreateConnection();
        IModel channel = connection.CreateModel();
    

    En la configuración predeterminada de RabbitMQ solo hay Invitado usuario que solo se puede utilizar para conexiones locales (desde 127.0.0.1). Una respuesta a esta pregunta explica cómo definir usuarios en RabbitMQ.

  2. Siguiente: crear una devolución de llamada para obtener resultados. Este ejemplo utiliza la respuesta directa, por lo que un oyente de respuesta se verá así:

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (model, ea) =>
        
            var ansBody = ea.Body;
            var ansMessage = Encoding.UTF8.GetString(ansBody);
            Console.WriteLine(" [x] Received 0", ansMessage);
            Console.WriteLine(" [x] Done");
        ;
        channel.BasicConsume(queue: "amq.rabbitmq.reply-to", noAck: true, consumer: consumer);
    
  3. Crear un mensaje de tarea que consumirá Celery:

        IDictionary headers = new Dictionary();
        headers.Add("task", "tasks.add");
        Guid id = Guid.NewGuid();
        headers.Add("id", id.ToString());
    
        IBasicProperties props = channel.CreateBasicProperties();
        props.Headers = headers;
        props.CorrelationId = (string)headers["id"];
        props.ContentEncoding = "utf-8";
        props.ContentType = "application/json";
        props.ReplyTo = "amq.rabbitmq.reply-to";
    
        object[] taskArgs = new object[]  1, 200 ;
    
        object[] arguments = new object[]  taskArgs, new object(), new object();
    
        MemoryStream stream = new MemoryStream();
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(object[]));
        ser.WriteObject(stream, arguments);
        stream.Position = 0;
        StreamReader sr = new StreamReader(stream);
        string message = sr.ReadToEnd();
    
        var body = Encoding.UTF8.GetBytes(message);
    
  4. Y finalmente, publicando el mensaje en RabbitMQ:

            channel.BasicPublish(exchange: "",
                             routingKey: "celery",
                             basicProperties: props,
                             body: body);
    

De acuerdo con este artículo, el cliente celery .Net usa el Programador de tareas predeterminado que viene con .Net Framework. Esto sabe cómo generar ID para su tarea. Este artículo también apunta a algún ejemplo aquí.

Apio viene con Flor. Flower proporciona una API REST para administrar tareas. https://flower.readthedocs.io/en/latest/api.html#post–api-task-async-apply-(.+) En la mayoría de los casos, esto será mucho más simple y robusto de usar que crear tareas manualmente y insertándolos en el MQ.

Aquí puedes ver las comentarios y valoraciones de los usuarios

Nos puedes sustentar nuestro ensayo fijando un comentario o valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *