2017-09-18 6 views
3

私はRebusを検討しており、Azure Service Busで使用しています。 Regalure Queuesでそれを使用するのは簡単でしたが、代わりにTopicを使用したい場合は、動作させることができません。AzureサービスバスでRebusでパブリッシュ/サブスクライブを処理する

セットアップが完了してトピック/サブスクリプションで使用されているものはありますか。これはこれまで私が持っていたものです。

 static void Main(string[] args) 
    { 
     _bus1 = InitializeBus(System.Environment.MachineName); 
     _bus2 = InitializeBus(System.Environment.MachineName + "_2"); 
     _bus3 = InitializeBus(); 

     Run(); 
     Console.WriteLine("Press Enter to exit!"); 
     Console.ReadLine(); 
    } 

    private static void Run() 
    { 
     try 
     { 
      _bus1.Handle<string>((b, c, m) => { Console.WriteLine(m); return null; }); 
      _bus2.Handle<string>((b, c, m) => { Console.WriteLine(m); return null; }); 
      _bus1.Bus.Subscribe<string>(); 
      _bus2.Bus.Subscribe<string>(); 
      _bus3.Bus.Publish("Publish test message"); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

    private static BuiltinHandlerActivator InitializeBus(string queueName = null) 
    { 
     var activator = new BuiltinHandlerActivator(); 

     if(string.IsNullOrEmpty(queueName)) 
      Configure.With(activator) 
       .Transport(t => t.UseAzureServiceBusAsOneWayClient(connectionString)) 
       .Options(o => { o.SetNumberOfWorkers(10); o.SetMaxParallelism(10); }) 
       .Start(); 
     else 
      Configure.With(activator) 
       .Transport(t => t.UseAzureServiceBus(connectionString, queueName).EnablePartitioning().DoNotCreateQueues()) 
       .Options(o => { o.SetNumberOfWorkers(10); o.SetMaxParallelism(10); }) 
       .Start(); 

     return activator; 
    } 

まず、すべてのバスを作成します。私はDontCreateQueues()を使用しています。なぜなら、キューは自分のルートに作成されて複製されるのではなく、トピックのサブスクリプションとしてのみ作成されるからです。 その後、私はバスをセットアップし、Publishは正常に動作します。作成された1つのトピックと、このトピックで作成された2つのサブスクリプションがあり、このサブスクリプションごとに1つのメッセージがあります。しかし、メッセージは決して収集されません。

コードの設定でDontCreateQueues()メソッドを削除したが、ルートキューブに2つのキューが作成され、トピックが2つありますが、そのようにはできません。

よろしく マグナス

答えて

0

REBUSは、あなたが購読各トピックのサブスクリプションを作成することによってトピックを使用して、バスの入力キューに受信メッセージを転送するサブスクリプションを設定します。

バスに予想される名前(Rebusによって作成されたキューまたは手動で作成されたキュー)がある入力キューがない場合、動作しません。

理由はDontCreateQueues()です。なぜなら、専門家のユーザーは、Rebusが行うことができる(そして気に入っている)ことを超えるキュー設定を構成できるからです。 Rebusがあなたのキューエンティティをどのようにレイアウトするかについてかなり詳細な知識が必要です。だから私は手動で何も作成しないことをお勧めします。

関連する問題