0

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

该过程本身正在对众多表进行各种数据操作、验证、更新、插入删除等。

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

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

我曾想过:

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

1 回答 1

0

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

我通常采用 3 种方法:

  1. 将更新包装在抑制环境事务的 TransactionScope 中(我怀疑这是当前正在发生的事情)
  2. 将过程分解为更小的消息(这可以减少数据库的争用,但代价是有更多的消息四处飞散)
  3. 通过其他进程通知外部客户端(例如,具有其他进程可以查询的某种远程服务/WCF/rest 服务,或通过某种事务无知进程发送通知)
于 2014-05-02T15:58:13.803 回答