【问题标题】:Domain events with Rebus and eventlisteners in NHibernateNHibernate 中使用 Rebus 和事件监听器的领域事件
【发布时间】:2015-09-08 11:02:34
【问题描述】:

我有一些 RebusHandlers,例如:

public class CastleRebusHandler : IHandleMessages<CastleRebusMessage>
{
    ... (ctor injections from windsor)

    public void Handle(CastleRebusMessage message)
    {
        var myPoco = _session.Get<MyPoco>(1);
        myPoco.MethodThatRaiseDomainEvent();
    }
}

MethodThatRaiseDomainEvent 方法将域事件添加到内部列表中,如 here 所述。

我在 NHibernate 中设置了一些 IPostUpdateEventListener,它将通过域事件集合运行并分派每个事件.我已经创建了一个类来控制 ISession 的 Rebus 在 BeforeMessage 和 AfterMessage 事件上。

在 Rebus 中 NHibernate = AfterMessage 的事件监听器中运行域调度事件代码(如链接中所述)。问题是如果这里发生异常怎么办?

如何将消息移动到 Rebus 的错误队列以发出失败信号?

我们使用的是0.83版本

【问题讨论】:

  • Rebus 应该在 n 次尝试失败后将消息移动到错误队列(默认为 5 次)。可以按照此处github.com/rebus-org/Rebus/wiki/… 所示进行配置。如果发生异常,例如在您的处理程序中,则将其视为失败。

标签: c# nhibernate rebus


【解决方案1】:

Rebus 有一个工作单元机制,你应该将你的会话提交动作挂钩到其中——你可以使用

Configure.With(...)
    .(...)
    .Events(e => e.AddUnitOfWorkManager(...))
    .(...)

您可以在其中提供执行工作的 uow 管理器。工作单元经理的工作是创建一个IUnitOfWork,您可以在其中调用会话伴随事务的提交和回滚。

我希望这是有道理的:)

【讨论】:

  • 谢谢,如果在AfterMessage 事件中抛出异常,会在UnitOfWork 管理器中触发Abort 吗?
  • 我想是的,是的,但是(当然,在不知道问题的所有细节的情况下)我认为现在在 Commit 中执行您在 AfterMessage 中的逻辑会更自然工作单位的
  • 是的,我用IUnitOfWork 实现了一个类,并在其中处理了会话管理。完美运行,并删除了 AfterMessageBeforeMessage 事件
猜你喜欢
  • 2011-04-25
  • 2011-07-05
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2020-05-06
相关资源
最近更新 更多