我是RabbitMQ集成的初学者。我正在用RabbitMq进行一些实验并将其作为任务运行员。
例如: 假设我有一个任务类,它有一个名为 Foo ()的方法
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.");
}
我有另一个名为 Producer 的类,它正在为RabbitMQ声明Queue。
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();
}
这里我们必须将字符串作为消息传递给消费者。
使用者类代码将使用此队列消息
public static void setGridViewHeightBasedOnChildren(GridView gridView, int columns) {
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null)
return;
int desiredWidth = View.MeasureSpec.makeMeasureSpec(gridView.getWidth(), View.MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
int rows = listAdapter.getCount() / columns;
if(listAdapter.getCount() % columns> 0){
rows++;
}
for (int i = 0; i < rows; i++) {
view = listAdapter.getView(i, view, gridView);
if (i == 0)
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LinearLayout.LayoutParams.WRAP_CONTENT));
view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = totalHeight + (gridView.getHorizontalSpacing() * rows);
gridView.setLayoutParams(params);
gridView.requestLayout();
}
正在接受字符串消息。有没有办法,我可以将我的函数调用传递给Producer或Rabbit MQ Queue,让Consumee执行那些在队列中的函数调用。
我尝试通过序列化/反序列化对象,然后使用反射来调用消费者代码中的方法。我正在寻找一些替代解决方案,通过使用委托或其他东西。任何帮助将不胜感激。
答案 0 :(得分:1)
您应该将任务代码库添加到您的消费者应用程序,然后使用该消息来管理任务执行,但不用它发送可执行代码。
我个人将MassTransit用于这种生产者/消费者场景;例如,您可以拥有多个消费者,每个任务一个,您可以激活正确的消费者,只需通过RMQ发送不同类型的消息。