NServiceBus丢失消息

NServiceBus丢失消息,nservicebus,Nservicebus,我有一些信息只是在生产中消失了 在日志中,它显示了方法HealLeEngEngEaseAd(),紧接着是HealLeDeMeMeAGE(),中间没有调用任何处理程序(这只是有时发生的!!!!) 因此,我将NServiceBus从3.2.8升级到4.6.1(目前的最新版本),并重构代码: public class OracleMessageModule : UnitOfWork.IManageUnitsOfWork { public OracleMessageModule() {

我有一些信息只是在生产中消失了

在日志中,它显示了方法HealLeEngEngEaseAd(),紧接着是HealLeDeMeMeAGE(),中间没有调用任何处理程序(这只是有时发生的!!!!) 因此,我将NServiceBus从3.2.8升级到4.6.1(目前的最新版本),并重构代码:

public class OracleMessageModule : UnitOfWork.IManageUnitsOfWork
{
    public OracleMessageModule()
    {
        Factory = new OracleSagaSessionFactory();
    }

    public OracleSagaSessionFactory Factory { get; set; }

    public void Begin()
    {
        Factory.Begin();
    }

    public void End(System.Exception ex = null)
    {
        Factory.Complete();
    }
}

这是OracleSagaSessionFactory的代码:

public class OracleSagaSessionFactory
    {
        public string ConnectionString { get; set; }

        [ThreadStatic] 
        private static OracleSagaSession current;

        public OracleSagaSession Begin()
        {
            if (current != null)
                throw new InvalidOperationException("Current session already exists.");

            var session = new OracleSagaSession(ConnectionString);
            current = session;
            return current;
        }

        public static OracleSagaSession Current
        {
            get
            {
                return current;
            }
        }

        public void Complete()
        {
            var c = current;
            current = null;
            if (c != null)
                c.Dispose();
        }
    }
查看NServiceBus代码在新版本中看起来像是清理了管道,所以这就是为什么我认为这是解决方案,我不认为这是我的代码问题

有人同意还是不同意


Edit1:它只发生在我的主节点上,有多个线程,有时也会发生。这不会发生在只使用一个线程的从属节点上。

重构为UOW和Oracle sesion工厂的Oracle消息模块与此有什么关系?您是否可以链接到GitHub上的NSB代码,您认为这可能是导致问题的原因?什么消息正在消失,哪些处理程序你认为他们应该命中?必须做任何事情,因为在日志中,我只看到工厂。注意:这只发生在某些消息中。
public class OracleSagaSessionFactory
    {
        public string ConnectionString { get; set; }

        [ThreadStatic] 
        private static OracleSagaSession current;

        public OracleSagaSession Begin()
        {
            if (current != null)
                throw new InvalidOperationException("Current session already exists.");

            var session = new OracleSagaSession(ConnectionString);
            current = session;
            return current;
        }

        public static OracleSagaSession Current
        {
            get
            {
                return current;
            }
        }

        public void Complete()
        {
            var c = current;
            current = null;
            if (c != null)
                c.Dispose();
        }
    }