在长时间运行的过程中使用NHibernate更新状态表

时间:2014-03-20 12:42:42

标签: nhibernate rhino-servicebus rhino-esb

我继承了一个实现多个长时间运行进程的项目。每个进程都会更新一个状态表,然后通过ajax轮询在UI上反映出来。这些进程在使用Rhino Service Bus(带有MSMQ)的后台应用程序中运行,并且通过发送"执行长进程"来触发该进程。消息。

该过程本身在许多表上进行各种数据操作,验证,更新,插入删除等。

似乎它真的滥用NHibernate会话,多个会话和嵌套的TransactionScopes到处都是。

我对NHibernate / RSB专家的问题是,如何在执行长时间运行的过程中更新状态表?

我想过:

  • 发送"更新状态消息"在执行过程中(将需要解决NHibernate / RSB会话管理问题)。
  • 使用带有数据库容量的saga并使用ajax轮询函数查询它而不是状态表

1 个答案:

答案 0 :(得分:0)

RSB流程中状态更新的问题通常是,消息处理在事务范围内发生。这意味着对数据库或您发送的消息的任何更改只会(通常)在提交事务后(通常在处理消息完成时发生)对其他应用程序可见。

我通常采用3种方法:

  1. 将更新包装在一个禁止环境事务的TransactionScope中(我怀疑这是当前正在发生的事情)
  2. 将该过程分解为更小的消息(这可以减少对数据库的争用,但代价是有更多消息在飞来飞去)
  3. 通过其他一些流程通知外部客户端(例如,有其他流程可以查询的某种远程服务/ WCF /休息服务,或通过某种交易无知流程发送通知)
相关问题