2016-04-14 13 views
0

私は初心者からRabbitMQへの統合です。私はRabbitMqを使っていくつかの実験を行い、それをタスクランナーにしていました。タスクランナーとしてのウサギMq

例えばのために

: レッツは、私はクラスを持っていると言うフー(と呼ばれる方法)

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

ここで、stringをメッセージとしてコンシューマに渡す必要があります。

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

を消費します。 ProducerやRabbit MQ Queueに関数呼び出しを渡し、Consumeeにキューにある関数呼び出しを実行させる方法がありますか?

オブジェクトを直列化/逆シリアル化し、リフレクションを使用してコンシューマーコードでメソッドを呼び出そうとしました。代理人などを使用して、代替ソリューションを探しています。どんな助けでも大歓迎です。

+0

シリアル化なしで行う方法はありません。代議員さえも連載する必要があります。 [Hangfire](http://hangfire.io/)は、あなたがしようとしていることを行い、アセンブリ情報、クラス名、メソッド名、および引数をシリアル化することによってこれを実現します。 – Rob

答えて

1

いいえ、できません。すべてのアセンブリコードをメッセージとともに「出荷」する必要がありますが、これは非常に悪い考えです。

タスクコードライブラリをコンシューマアプリケーションに追加し、そのメッセージを使用してタスク実行を管理する必要がありますが、タスクコードの実行コードは送信しません。

私は個人的にこの種の生産者/消費者シナリオでMassTransitを使用します。たとえば、複数のコンシューマを各タスクに1つずつ含めることができます。RMQを使用して異なる種類のメッセージを送信するだけで、適切なコンシューマをアクティブ化できます。

+0

ありがとうございます。私は、シリアル化/デシリアライズロジックに従うことにしました –