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();
}
}