Rebus - 在MemoryCache回调中使用sql传输的总线

时间:2017-01-19 09:35:35

标签: rebus

我有一个消息处理程序,它会在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();
    }
}

有没有办法让我这样做?

1 个答案:

答案 0 :(得分:0)

何时调用CacheCallback方法,以及在哪个线程上?

对我来说,问题就是调用CacheCallback的线程在AmbientTransactionContext.Current中有一个值,这是Rebus在可能的情况下进行队列操作的地方。

如果事务上下文以某种方式保留,即使处理程序完成执行,那么关闭的缓存项(例如与SQL传输关联的SqlConnectionSqlTransaction)将被关闭。