问题标签 [saga]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unit-testing - 当 Saga 有多个处理程序时如何为 NServiceBus Saga 创建单元测试
我曾经有过这个测试,它通过得很好(一旦处理了所有三个消息,传奇就完成了。
我现在想将 TestSagaNonStartingMessage 分解为它自己的处理程序,并执行以下操作:
但是,在处理 TestSagaNonStartingMessage 时 - 传奇数据不会从以前的处理程序中保留下来。
我是否有持久性问题,或者测试构建得不好?
nservicebus - 如何防止 NServiceBus 传奇多次启动?
我想创建一个由消息“Event1”启动的传奇,但它将忽略接收到具有相同应用 ID 的“重复”启动消息(这可能是由于两个或多个用户在短时间内点击 UI 按钮) . 该文档似乎表明这种方法可行:
- 佐贺宣布
IAmStartedByMessages<Event1>
- Saga 将自身配置为
ConfigureMapping<Event1>(s => s.SomeID, m => m.SomeID);
- Handle(Event1 evt) 在处理第一条消息时设置一个布尔标志,如果该标志已经设置,则退出处理程序。
这行得通吗?如果订阅者是多线程的,我会有竞争条件吗?如果是这样,我怎样才能实现所需的行为?
谢谢!
import - 使用 NService Bus 导入数据
使用 NService 总线。2.00.19(使用 MSMQ 和 SQL 2008)
我们想将数据导入我们的系统。
这些文件可能非常大,所以我们有后台处理器,它将从总线读取消息。这可能需要一个小时来处理。
其他人有这样做过吗?传奇是最好的前进方式吗?
configuration - 如何解决与 NHibernateSagaPersister 的自动装配冲突?
我正在尝试连接我的第一个 Saga,但无法让接收端点正确处理启动消息。我得到以下异常:
SagaMessageHandler 处理消息失败。Spring.Objects.Factory.UnsatisfiedDependencyException:创建名称为“NServiceBus.Sagas.Impl.SagaMessageHandler”的对象时出错:通过对象属性“Persister”表示不满足的依赖关系:有 2 个类型为 [NServiceBus.Saga.ISagaPersister] 的对象用于按类型自动装配,当应该只有 1 个能够自动装配对象“NServiceBus.Sagas.Impl.SagaMessageHandler”的属性“Persister”时。
我猜内存中的持久化器和 NHibernateSagaPersister 都存在冲突,但我不知道如何解决这个问题。我的配置是这样的:
如果我删除 LoadMessageHandlers(),错误就会消失,但我的处理程序当然不会被调用。有什么想法吗?当我在生产配置文件中使用 AsA_Server 时,传奇工作正常,没有自定义初始化,但出于其他原因我需要使用它。
nservicebus - 在 NServiceBus 中,当没有匹配 saga 的消息传入时,我该如何处理?
如果我有一个包含两种消息类型的 saga,比如由 message1 开始并由 message2 完成,如果 message2 在没有 message1 的情况下进入,我可以返回回调吗?我知道它会将它转储到错误队列中,但我希望能够向发送客户端返回一个状态,以说明由于第一条消息不存在而导致错误状态。
domain-driven-design - 依赖于过去事件的传奇
我有一个问题如何处理一个传奇,其中决策取决于在传奇创建之前发布的事件。
这是一个例子来说明我的问题:
想象一下,我有一个 CustomerAR 和一个 OrderAR。当创建 customerAR 时,验证过程开始,该过程的结果是客户无需特别授权即可自由消费的订单金额。我不会详细介绍这个过程,因为它脱离了上下文。计算金额时,将使用计算出的金额向 CustomerAR 发送命令,然后 CustomerAR 发布具有该值的事件 (CustomerMaxOrderAmountEvent)。到目前为止,一切都很好。
几周后,客户下了订单。OrderAR 已创建并启动我的 OrderSaga。saga 等待订单完全创建,然后必须做出决定是否需要为该订单发送 AutorizationCommand。要做出该决定,它必须知道 CustomerMaxOrderAmountEvent 是否已发布以及金额的值。通常 OrderSaga 也会订阅 CustomerMaxOrderAmountEvent,但问题是这个事件永远不会发生,因为它在过去已经发生过。
我该如何处理。我是否应该查询读取模型以了解该值,是否应该发送命令来获取该值,是否应该引用 CustomerAR,是否应该重播 saga 中的所有历史事件以便他已经知道历史。
更新
请注意,这是关于概念而不是关于这个具体示例。该示例纯粹是为了澄清问题:“2 个不相关的聚合根,它们不是同一有界上下文的一部分。”
感谢您的帮助。
梅尔文
cqrs - 基于时间的 Sagas 和事件溯源
假设我想要一个由某个事件创建的 saga,然后坐下来等待几个小时,如果没有任何反应,就发出一些命令。
现在,如果这个 Saga 都在内存中并且我必须重新启动应用程序/服务器,那么这个 saga 将被卸载并且再也见不到了,对吧?
一旦系统重新上线,我会使用事件溯源来加快这个 Saga 的速度吗?
如果是这样,我几乎需要一个带有“活动 saga”的单独事件存储,可以在系统启动时重播,以使我的 Sagas 跟上速度。到目前为止,这对我来说似乎很好,但我将如何实现超时?
我需要某种方式来“伪造”重播时的超时,考虑到可能会有几个后续超时,具体取决于进入传奇的事件。
c# - 我的 Saga 结构是正确的解决方案吗?(NServiceBus)
我会直接切入。我正在尝试通过发送给我们银行的文件自动执行信用卡付款。银行卡付款未实时验证。银行在一夜之间处理付款,并在第二天发送一个响应文件,其中包含成功和不成功的付款。
我有一个网络应用程序,当它接受或取消付款时,会(通过 Bus.Send)将包含付款/取消详细信息的消息发送到命令消息处理器。
然后处理器发布(通过 Bus.Publish)这个给所有服务看。
一项服务需要执行以下操作:
- 收到第一条消息后开始一个 saga
- 发出关闭业务的超时请求
- 跟踪所有后续消息(在 saga 中)
- 收到超时后,将付款和取消消息转入银行文件。
问题是我不知道如何在 saga 中存储消息集合(或其他任何内容),因为 List<> 不允许作为虚拟成员。
这是当前的传奇结构:
有什么想法吗?
c# - 努力实施 IFindSagas
我有一个持续一天的传奇。
收到消息后,我想找到活动的 saga 并在 Handle(message) 方法中执行操作。
我没有 ConfigureHowToFindSagas 方法,因为我想要当前的方法,如果有的话。收到的所有消息都将影响一个 saga,直到收到超时消息。当前的 saga 完成,并在收到新消息后创建一个新的。但是从我读到的内容来看,我需要实现 IFindSagas 才能做到这一点,可能还有我自己的 Saga 持久化器。
我需要关于从哪里开始以及这是否是正确的方法的建议。代码示例会很有帮助,因为我对使用接口还比较陌生。
c# - Bus.Publish() 或订阅引起的 StackOverflowException?
我有一个代理使用 saga 来跟踪给定类型的传入消息,直到收到超时消息。在超时处理程序中,我有以下内容:
TransactionItems 是一个 ICollection
这是 TransactionDetail 类:
如果我没有任何订阅,则 Bus.Publish() 调用会正常进行。如果我订阅了其他服务,我会收到以下错误消息:
mscorlib.dll 中出现“System.StackOverflowException”类型的未处理异常
除此以外没有关于溢出的更多信息:{Cannot evaluate expression because the current thread is in a stack overflow state.}
我有自己的 SagaPersister、Profile 和 SagaRegistry,但不确定它们是否与此问题相关,但如果需要可以提供。