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 发送不同类型的消息即可。
我是 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 发送不同类型的消息即可。