Rabbit Mq as Task Runner

时间:2016-04-14 07:31:50

标签: c# delegates queue rabbitmq

我是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执行那些在队列中的函数调用。

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

1 个答案:

答案 0 :(得分:1)

不,你不能。您需要使用消息“发送”所有汇编代码,这绝对是一个非常糟糕的主意。

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

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