Rabbitmq 作为任务运行器

Rabbit Mq as Task Runner

我是 RabbitMQ 集成的初学者。我正在用 RabbitMq 做一些实验并将其作为任务运行器。

例如: 假设我有一个 class Tasks,它有一个名为 Foo()

的方法
public static string Foo(string test, int id)
{
  return "Admin" + test + id.ToString();
}

我有另一个名为 Producer 的 class,它正在为 RabbitMQ 声明 Queue。

using (var conn = factory.CreateConnection())
                {
                    using (var channel = conn.CreateModel())
                    {
                        channel.QueueDeclare(queue: "KKQueue", durable: false, exclusive: false, autoDelete: false, arguments: null);
                        var message = "Hello World";
                        channel.BasicPublish(exchange: string.Empty, routingKey: "KKQueue", basicProperties: null, body: Encoding.UTF8.GetBytes(message ));
                        Console.WriteLine(" [x] Sent {0}", message);
                    }
                    Console.WriteLine(" Press [enter] to exit.");
                }

这里我们必须将字符串作为消息传递给消费者。

消费者class代码将消费这个队列消息

using (var connection = factory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: "KKQueue", durable: false, exclusive: false, autoDelete: false, arguments: null);
                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (model, ea) =>
                    {
                        var message = Encoding.UTF8.GetString(ea.Body);


                        Console.WriteLine(" [x] Received {0}", message);
                    };
                    channel.BasicConsume(queue: "KKQueue", noAck: true, consumer: consumer);
                    Console.WriteLine(" Press [enter] to exit.");
                    Console.ReadLine();
                }

正在接受字符串 消息。有没有一种方法可以将我的函数调用传递给 Producer 或 Rabbit MQ Queue,让 Consumee 执行那些在队列中的函数调用。

我尝试通过 serializing/deserializing 对象,然后使用反射调用消费者代码中的方法。我正在通过使用委托或其他方式寻找一些替代解决方案。任何帮助将不胜感激。

不,你不能。您需要 "ship" 包含消息的所有汇编代码,这绝对是一个非常糟糕的主意。

您应该将您的任务代码库添加到您的消费者应用程序,然后使用该消息来管理任务执行,但不要随它一起发送可执行代码。

对于这种 producer/consumer 场景,我个人使用 MassTransit;例如,您可以有多个消费者,每个任务一个,您可以激活正确的消费者,只需通过 RMQ 发送不同类型的消息即可。