问题标签 [automatonymous]
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.
c# - 如何正确监控 MassTransit Courier 路由单?
我设法通过一系列活动来实施 MassTransit Courier 路由单。我决定添加一个状态机来监控它,因此我创建了单独的事件和状态,并使用 EF Core 作为 Automatonymous 状态机的存储。为了跟踪当前状态,我在每个活动执行结束时发布一个事件。一切正常,我可以监控数据库中路由单的当前状态。
但这是最好的方法吗?根据 MassTransit 文档中的这一部分:https ://masstransit-project.com/advanced/courier/events.html看起来应该自动发布事件。那么也许还有另一种方法来监控路由单,它不需要创建事件并在每个活动中手动发布它们?
masstransit - 重新启动 MassTransit Saga
在我的应用程序中,用户可以触发特定资源的更新。发生这种情况时,将发送一个UpdateInitiated
事件。
MassTransit Saga 基于该事件启动,并触发一系列其他事件,直到它认为自己完成并最终确定。
在更新过程中,用户可以对资源进行更改并请求新的更新。我试图弄清楚如何在UpdateInitiated
为同一资源发送新事件时中止正在进行的 Saga 并创建一个新实例。
我正在考虑的两种方法
与 ResourceId 相关。所以最初的 Saga 也会得到第二个
UpdateInitiated
事件。但是后来我不知道如何重置传奇(并停止侦听与先前更新相关的事件)。使用
CorrelatedBy<Guid>
(就像我现在所做的那样)。这将为新的更新事件创建一个新的 Saga。但是后来我不知道如何取消初始 Saga。
有没有办法在 Saga 中监听任意事件?比如:“监听所有UpdatedInitiated
事件,即使它们不相关,如果有匹配 ResourceId 的事件,则取消当前 Saga”。
masstransit - 中止 MassTransit Saga 的活动链
我试图弄清楚如何中止一系列活动,如果一个活动确定有问题,那么 Saga 应该被最终确定。
例如:
InitialSetup
将根据从数据库加载的一些信息配置 Saga。让它意识到缺少所需的数据,并且应该在StartUpdating
运行活动之前完成 Saga。
我怎样才能做到这一点?
masstransit - 测试 MassTransit 状态机 saga 活动
我正在尝试Activity
对我的 MassTransit 状态机传奇的自定义进行单元测试。
它看起来像这样:
我想不通的是,ConsumeContext
在为此类编写单元测试时,我如何模拟/伪造期望。我试图使用 找到一些东西,InMemoryTestHarness
但找不到任何合适的东西。
编辑:
我不妨把这个也扔进去。我如何context
在测试工具中模拟或运行它?这样我也可以对这个 Activity 进行单元测试吗?
masstransit - 记录处理的 MassTransit Saga 异常
我试图弄清楚如何记录处理的异常。当前从 Activity 抛出的异常将被吞没(例如,如果在尝试创建 Acitivity 时出现 DI 错误)。
我可以做些什么来记录捕获的异常?
(抱歉最近向 MassTransit 标签发送垃圾邮件 :) )
masstransit - 使用预定事件测试 MassTransit 传奇
尝试按照有关如何测试使用 DI 的 Saga 的示例(https://masstransit-project.com/usage/testing.html#testing-using-dependency-injection)
但是,我无法使用 Saga 上的预定事件进行测试。我正在关注https://masstransit-project.com/usage/sagas/automatonymous.html#schedule上的示例
AddRabbitMqMessageScheduler
通过在我的消息总线配置中添加和,我已经让它与 RabbitMQ 一起使用UseDelayedExchangeMessageScheduler
。
在测试中,我得到以下异常:
The payload was not found: MassTransit.MessageSchedulerContext
我想这是因为我没有为提供者配置正确的东西。我正在尝试找到正确的扩展方法,但我想可能不支持与AddMassTransitInMemoryTestHarness
?
c# - 将 saga 的响应关联回请求者
我正在学习使用来自 Masstransit 的 automatonymous,它是一个很棒的框架。但是,我在使用 saga 实现请求/响应时遇到了一些问题。我的用例就像非常标准的订单流程。
一些代码:
我向传奇提出这样的请求:
然后在 saga 中,配置如下所示:
在两者之间还有一个消费者创建实际交易并成功返回。获取消费者响应并触发 CreateTransaction.Completed 并且 saga 转换为 Paying。但是,响应永远不会出现在我的 requestclient 中。
同样在输出日志中,我看到 OrderPayment 消息已发送到总线,但由于某种原因,我一直在 requestclient 中遇到超时,所以不知何故,响应与该客户端没有关联,我不知道为什么。
c# - 每个事件完成后如何在自动状态机中发布事件?
我有一个带有一堆事件的自动状态机。我想在前一个事件完成后发布每个事件。我知道我可以在每个事件的消费者中发布它,但其中一些可能会在不同的状态机中重用,所以我想在状态机定义中声明它。这是我现在拥有的:
有了这个定义,第二步在第一步仍在执行时发布,第三步在第二步正在执行时发布。我想确保第一步完成,然后第二步发布,然后第二步完成,第三步发布。我尝试使用WhenLeave
行为,但它需要一个状态,而不是一个事件,所以我无权访问,context.Data
并且 CorrelationId 将不仅仅是我将在步骤之间传递的变量。
有没有办法在状态机定义中实现这一点?
masstransit - Automatonymous - 使用发送活动调用 RaiseEvent 时未找到有效负载
我一直在转动我的轮子试图让 MassTransitStateMachine 工作,我似乎不明白这应该如何工作。
我收到的错误(下面的完整代码)是PayloadNotFoundException
当我尝试stateMachine.RaiseEvent(instance, stateMachine.DeployApplicationRequest, request)
结合.Send()
状态机中的 Activity 调用时。我一直试图追查这一点,但一无所获。
以下是相关代码和意图解释:
我收到通过 webAPI 帖子部署应用程序的请求,并将请求转换为DeployApplicationRequest
.
这个请求封装了两件事:API 需要维护的状态,以便它知道如何将结果路由回请求者(状态机属性)以及Command
要发送到服务总线的状态。
命令 ,DeployApplication
如下所示:
我创建了一个状态实例来保存请求的详细信息(例如它是通过 Slack 还是通过 Teams 进入的)。我不想将此信息发布到总线:
我创建了一个StateMachine
来处理这个:
为了触发初始事件(因为请求不是通过消费者而是通过控制器进入的),我已经将状态机注入到 MassTransit 客户端,并且我正在调用该RaiseEvent
方法:
容器配置如下:
Submitted
引发事件工作得很好,如果我不包括 .Send(...)
在状态机中,状态机就会成功转移。我介绍的第二个我Activity
得到了PayloadNotFoundException
. 周末我尝试了大约 15 种不同的方法,但都没有成功,我希望有人能帮助我了解我的方法的错误。
谢谢阅读!顺便说一句,很棒的图书馆。我将寻找方法为这方面的发展做出贡献,这是我遇到的最有用的库之一(克里斯,你的 Youtube 视频非常棒)。
c# - 在 if-else 子句中跳过公共交通状态
我正在尝试制作一个状态机,如果我的操作以 OK 状态结束,它应该发送一封电子邮件,或者它应该至少重复该操作 n 次,直到它以 OK 状态结束。如果超过 n 次阈值,状态机应该只是回滚并停止。
我玩弄了状态和提供的一些方法,但是我无法设法在 if 中使用 TransitionTo(State) 方法来充当“goto”并跳转到 State 忽略这一点以下的每一行代码.
所以,把它放在 C# 伪代码中,它看起来像这样(这只是一个表示,以防状态机代码难以理解,我不在我的应用程序中使用此代码):
以及我使用的状态机代码(请记住,numberOfRetries的递减是在 GetActionStatus() 中完成的)
但是当我运行状态机时,我得到的输出是:
当预期的输出应该只是
要不就
因为我希望如果第一个if条件为真,它应该转移到下一个状态(在我的例子中是 SendEmailToUser)并从那里继续执行。只有当条件评估为假时,它才应该继续到第二个if(检查重试的那个)。
我错过了什么吗?