2016-04-14 76 views
0

我是RabbitMQ整合的初學者。我正在做一些RabbitMq的實驗,並將其作爲任務執行者。Rabbit Mq作爲Task Runner

對於如: 讓說我有一個類任務,其中有)

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

我已經被宣告隊列RabbitMQ的另一個類稱爲監製,稱爲(方法。

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."); 
       } 

這裏我們必須把消息傳遞給消費者。

Consumer類代碼將消耗此隊列消息

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(); 
       } 

其接受字符串消息。有沒有辦法,我可以通過我的函數調用生產者或兔子MQ隊列,讓消費者執行這些隊列中的函數調用。

我嘗試通過序列化/反序列化對象,然後使用反射來調用消費者代碼中的方法..我正在尋找一些替代解決方案,通過使用委託或什麼。任何幫助將不勝感激。

+0

沒有序列化沒有辦法做到,沒有。即使代表也需要序列化。 [Hangfire](http://hangfire.io/)做你想做的事情,通過序列化程序集信息,類名,方法名和參數來實現。 – Rob

回答

1

不,你不能。你需要用信息「彙集」所有彙編代碼,這顯然是一個非常糟糕的主意。

您應該將任務代碼庫添加到消費者應用程序,然後使用消息來管理任務執行,但不發送可執行代碼。

我個人對這種生產者/消費者場景使用MassTransit;例如,您可以有多個使用者,每個任務使用一個,您可以激活正確的使用者,只需通過RMQ發送不同類型的消息即可。

+0

謝謝。我決定遵循序列化/反序列化邏輯 –

相關問題