2017-01-19 6 views
1

У меня есть обработчик сообщений, который накапливает сообщения в MemoryCache в течение заданного времени, так что будет обрабатываться только последний.Rebus - Bus с пересылкой sql в обратном вызове MemoryCache

Когда происходит обратный вызов, я хочу переслать другое сообщение обработчику, используя 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, где Rebus забирает операции очереди, когда это возможно.

Если контекст транзакции был каким-то образом сохранен, даже несмотря на то, что обработчик завершил выполнение, то связанные кешированные элементы (например, и SqlTransaction, связанные с транспортом SQL) будут закрыты.

+0

CacheCallback вызывается, когда истекает срок действия или когда другое сообщение вставляется в System.Runtime.Caching.MemoryCache. Он вызывается в другом потоке. – Daniel

+0

На какой нить? От куда это? – mookid8000

+0

Рабочий поток, я не знаю внутренней работы MemoryCache: S – Daniel