2017-01-19 2 views
1

メッセージキャッシュにメッセージを蓄積して、最後のメッセージのみが処理されるようにしました。Rebus - MemoryCacheコールバックでSQLトランスポートを使用するバス

コールバックが発生したとき、私はsqlトランスポートを使用して別のメッセージをハンドラに転送したいが、今度はsql接続が閉じられている。

コードは次のようなものになります。

public IBus SqlBus { get; set; } 

public async Task Handle(ServiceMessage message) 
{ 
    await base.Handle(() => 
    { 
     cache.Set(CacheKey, message, new CacheItemPolicy() 
     { 
      AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10), 
      RemovedCallback = new CacheEntryRemovedCallback(CacheCallback), 
     }); 

     return Task.FromResult(0); 
    }, message); 
} 

private void CacheCallback(CacheEntryRemovedArguments arguments) 
{ 
    if (arguments.RemovedReason == CacheEntryRemovedReason.Expired) 
    { 
     var message = arguments.CacheItem.Value as ServiceMessage; 
     SqlBus.Send(new AnotherMessage()).GetAwaiter().GetResult(); 
    } 
} 

を私はこれを行うことができます任意のアプローチがありますか?

答えて

0

CacheCallbackメソッドはいつ呼び出され、どのスレッドでですか?

CacheCallbackを呼び出すスレッドがAmbientTransactionContext.Currentという値を持っているということが問題のようです。

ハンドラが実行を終了したにもかかわらずトランザクションコンテキストが何らかの形で保存された場合、関連するキャッシュされたアイテム(たとえば、SqlConnectionおよびSqlTransactionはSQLトランスポートに関連付けられます)が閉じられます。

+0

CacheCallbackは、有効期限が切れたとき、またはSystem.Runtime.Caching.MemoryCacheに別のメッセージが挿入されたときに呼び出されます。それは別のスレッドで呼び出されます。 – Daniel

+0

どのスレッドですか?それはどこから来たのですか? – mookid8000

+0

ワーカースレッド、私はMemoryCacheの内部動作を知らない:S – Daniel

関連する問題