2017-06-05 8 views
0

私はNServiceBusのドキュメントを見て、複数のテナントをセットアップして各テナントの個々のデータベースにsagaデータを保存するサンプルを実行しました。NServiceBus v5マルチテナント佐賀の例をホステッドサービスとして設定できません

https://docs.particular.net/samples/outbox/multi-tenant/?version=core_5

私は現在、NServiceBus.Hostパッケージを使用してWindowsサービスとして実行されているNServiceBusのアプリケーションを持っています。いくつかのテナント間で単一のサガデータテーブルを共有しているため、ホストされるサンプルを簡単に変換できるようになるため、既存のプロジェクトをマルチテナントSQL接続に変換する必要があります。ただし、この例では、コンソールアプリケーションと手動で作成されたバスが使用されています。私は期待して私はEndpointConfig.csファイルが追加されたサンプルアプリケーションにNServiceBus.Host NuGetパッケージを追加しますが、私はパイプラインエグゼキュータと連携する方法を見つけ出すことができない場合

Program.csのレシーバープロジェクトでは、これがあります:

internal static PipelineExecutor PipelineExecutor; 

var busConfiguration = new BusConfiguration(); 
PipelineExecutor = ((UnicastBus) startableBus).Builder.Build<PipelineExecutor>(); 

しかし、あなたは明らかにEnpointConfig.csホストされているアプリケーションの内のことを行うことはできません。

次のあなたは、個々のクライアント接続がnext();

を介して実行され、それに対応するキーとのコンテキストと次のパイプラインのステップに詰めているコンテキスト IncomingContext contextへのアクセス権を持っている 起動方法で MultiTenantOpenSqlConnectionBehavior.csを表示する場合
class MultiTenantOpenSqlConnectionBehavior : 
    IBehavior<IncomingContext> 
{ 

    public void Invoke(IncomingContext context, Action next) 
    { 
     var defaultConnectionString = ConfigurationManager.ConnectionStrings["NServiceBus/Persistence"] 
      .ConnectionString; 
     #region OpenTenantDatabaseConnection 

     string tenant; 
     if (!context.PhysicalMessage.Headers.TryGetValue("TenantId", out tenant)) 
     { 
      throw new InvalidOperationException("No tenant id"); 
     } 
     var connectionString = ConfigurationManager.ConnectionStrings[tenant] 
      .ConnectionString; 
     var lazyConnection = new Lazy<IDbConnection>(() => 
     { 
      var connection = new SqlConnection(connectionString); 
      connection.Open(); 
      return connection; 
     }); 
     var key = $"LazySqlConnection-{defaultConnectionString}"; 
     context.Set(key, lazyConnection); 
     try 
     { 
      next(); 
     } 
     finally 
     { 
      if (lazyConnection.IsValueCreated) 
      { 
       lazyConnection.Value.Dispose(); 
      } 
      context.Remove(key); 
     } 

     #endregion 
    } 
} 

そしてMultiTenantConnectionProvider.csにおいて、上記宣言静的PipelineExecutorが参照されているとコンテキストでは、上記のクラスで設定された同じキーを使用して接続を取得できます。

class MultiTenantConnectionProvider : 
    DriverConnectionProvider 
{ 

    public override IDbConnection GetConnection() 
    { 
     var defaultConnectionString = ConfigurationManager.ConnectionStrings["NServiceBus/Persistence"] 
      .ConnectionString; 

     #region GetConnectionFromContext 

     Lazy<IDbConnection> lazy; 

     // 
     // This line is the problem. The static Program.PipelineExecutor is accessed 
     // 
     var pipelineExecutor = Program.PipelineExecutor; 

     var key = $"LazySqlConnection-{defaultConnectionString}"; 
     if (
      pipelineExecutor != null && 
      pipelineExecutor.CurrentContext.TryGet(key, out lazy)) 
     { 
      var connection = Driver.CreateConnection(); 
      connection.ConnectionString = lazy.Value.ConnectionString; 
      connection.Open(); 
      return connection; 
     } 
     return base.GetConnection(); 

     #endregion 
    } 
} 

は確かにホストされたアプリケーションでこれを行う方法がなければならないが、私はこれを行う方法上の任意の情報を見つけることができません。

+0

あなたはNServiceBusバージョン5.xでこれを行うために探していますか? –

+0

はい、バージョン5.xです。 –

答えて

0

残念ながら、NServiceBusホストはマルチテナントシナリオをサポートしていません。代わりに、あなたはそのサンプルがセルフホスティングサービスhttps://docs.particular.net/nservicebus/hosting/windows-service

コードはかなり簡単ですを使用して取ることができ

+0

これは可能性もありますが、サンプルコードで問題が発生している可能性もあります。 静的なProgram.PipelineExecutorのスレッドの安全性については不思議です。 –

関連する問題