问题标签 [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.

0 投票
2 回答
756 浏览

c# - 在之前使用 RaiseEvent 后使用 MassTransit 和 Automatonymous Publish 时获取 ConsumeContext 不可用

如果我们设置了一个 Saga 并立即Publish(context => ...)然后一条消息成功地到达总线。

但是,如果我们有类似的东西

机器也永远不会转换到最终状态,大概是因为异常定位了一个 ConsumeContext。

我们已经看到了一些关于将 aConsumeContext作为参数传递的引用,Publish()但是不清楚这需要哪个上下文(Intellisense 只是引用了 context1、context2、context3 等)。

有没有办法在已经被调用Publish()之后使用?RaiseEvent()如果没有,有没有办法使用其他机制发布事件?

MassTransit 版本是 5.1.5,Automatonymous 是 4.1.2


编辑根据 Chris Patterson 在这里的回答,我们尝试在任何Initially或之外添加以下内容During

但是它仍然没有发布任何内容,并且状态永远不会转换为Final. 如果我们添加 aThen它也永远不会碰到这个代码块。似乎没有发生任何异常。我们也尝试过使用When(SomeState.Enter),它也不起作用。

附带问题,也许这将有助于我理解为什么Publish并且RaiseEvent似乎不能很好地一起玩 - 为什么Publish需要ConsumeContext? 是定位总线和绑定吗?

0 投票
1 回答
445 浏览

masstransit - 如何触发自动状态机中使用的活动的补偿流程的执行?

我的活动在执行过程中不时抛出异常,因此我实现了 Faulted 方法Activity<TInstance>来处理它,丢弃了在方法中所做的更改Execute。我认为在 Automatonymous 中存在一些布线,使得在Execute方法抛出异常时执行 Faulted 方法,然后为已经执行的活动调用 Faulted 方法。事实证明,没有这样的事情,因为我的错误方法永远不会执行。

我应该在 try/catch 块中调用那些自己吗?我可以产生BehaviorExceptionContextProxy基于BehaviorContext和抛出的异常。我唯一Behavior可以通过的下一个是插入到 that方法中ActivityExecute那个,但从逻辑上讲,这意味着我在错误的方向上进行补偿,因为下一个Behavior实际上是在这个成功后执行的,所以我会补偿太多。

我还尝试使用Catch状态机中的 ,它确实处理了异常,但是,当我只有现在时,我找不到任何方法来开始为失败的活动执行补偿流ExceptionActivityBinder

有什么好的方法可以触发活动的补偿流程吗?

0 投票
2 回答
739 浏览

docker - Azure 服务总线 - 当应用程序位于 Docker 容器中时出现 MessageLockLostException,否则工作正常

我们有一个 .NET Core 控制台应用程序,它充当 Saga/Process 管理器的角色。

这个 Saga 应用通过Azure 服务总线与其他微服务通信(使用MassTransit进行消息传递抽象 - MassTransit.Azure.ServiceBus)

该应用程序包含一个处理事件的状态机 (MassTransit/Automatonymous) - 由服务总线消息触发。

在当前场景中,初始 Saga 事件是通过通过 MassTransit 发布消息从 Azure Function App 触发的:

现在,当:

a) Saga 应用程序按原样运行,(无容器化) - 一切正常,事件处理正确。

b) Saga 应用程序被放入本地的 Docker 容器中(在 VS2017 中使用 docker-compose) - 发生异常。从本质上讲-似乎在发布消息后确实到达了 Saga 应用程序,但是立即发生以下异常(摘录):

接收方收到异常:sb://***.servicebus.windows.net/link_provider_saga 在 RenewLock 期间,Microsoft.Azure.ServiceBus.MessageLockLostException:提供的锁无效。锁已过期,或者消息已从队列中删除

这是状态机 ( Automatonymous ) 中的消息处理代码,它在 dockerized 时永远不会到达:

这是 docker-compose 配置:

这是应用程序的 DockerFile:

为什么 Docker 会导致通信问题?我的预感是:

a)不正确的端口映射/发布 - 但是触发微服务显然以某种方式到达容器

b) TLS 协议/证书(由 Azure 服务总线使用)未正确设置(不是一件小事)

PS dockerized Saga 应用程序是通过 docker-compose 的“开始调试”从 VS2017 本地启动的

PS2 在 Dockerfile 中使用 EXPOSE 端口 80 没有解决问题

0 投票
1 回答
1042 浏览

c# - 使用 saga 事件对消费者中发布的消息做出反应

我正在将 Mass Transit 与 RabbitMq 和 Automatonymous 一起用于 asp.net core 2.1 应用程序的概念证明。我将 EntityFramework 核心与 Postgres 一起使用以实现持久性。

我要做的是在向 http rest api 发出请求时启动一个 saga,并在 saga 完成后返回结果。我正在做的是:

  • 使用具有请求/响应客户端的接口连接一个事件以启动我的传奇
  • 在传奇中发布一条由消费者消费的消息
  • 在消费者中发布与我的传奇中的另一个事件相对应的消息
  • 完成后从我的传奇中返回响应并最终确定

这是我的代码:

我的界面

我的传奇实例

用于在状态机中发布的 IDoOperationRequest 的具体实现

用于在状态机中发布的 IStartSagaResponse 的具体实现

我的状态机

我的消费者:

我如何在 Startup.cs 中的 DI 中连接事物

并在我的控制器中发出请求:

我看到的是我的状态机确实启动了。When(StartSagaRequestEvent) 确实被击中并发布了 DoOperationRequest 消息。DoOperationRequestConsumer 确实收到消息并发布 IOperationComplete 消息。然而,这就是它停止的地方。我的状态机中的 IOperationCompleteEvent 没有被调用。当我查看数据库时,我可以看到我的 saga 实例是使用 guid 创建的,并且 CurrentState 设置为 OperationPending。当我查看我的 rabbitmq 管理仪表板时,我看到在 DoOperationRequestConsumer 执行 IOperationComplete 消息发布之后发布了一条消息。我只是没有看到状态机使用消费者发布的 IOperationComplete 消息。

我还尝试在消费者中显式使用“执行操作”队列:

但仍然无法建立连接。

我整天都在努力解决这个问题,不确定我在这里错过了什么。如果有人可以就我可能做错的事情给我一些建议,我将非常感激,再次为文字墙感到抱歉,我知道它可以阅读,但我想清楚我在做什么。非常感谢!

0 投票
0 回答
511 浏览

.net-core - MassTransit saga azure 服务总线接收端点设置?

我正在尝试将 MassTransit 配置为使用 Azure 服务总线与自动状态机一起使用,但我看不到任何有关如何执行此操作的工作示例。我们之前使用的是使用以下代码配置的 RabbitMQ。我已改用 Azure 服务总线而不是 .CreateUsingRabbitMq() 操作,但似乎存在一些错误配置。官方文档在这方面有点轻。

  1. 操作系统:Windows 10 Pro
  2. Visual Studio 版本:2017
  3. 点网版本:2.2

我在 Azure 服务总线中创建了一个名为“SomeQueue”的队列

我有一个 StateSage cs.proj 负责使用 Automatonymous 处理 saga 工作流。在其配置中,我有以下内容

现在我知道常量 AzureServiceBusConfigurationSettings.Uri 工作正常,因为我通过另一个项目将消息放在 Azure 服务总线中的队列上,该项目充当接收一些数据的 WebApi 将其发送到服务总线。

有没有人尝试过这样做或对 Automatonymous 有任何经验?

0 投票
0 回答
821 浏览

exception - 有例外的公共交通传奇

我想在我的 .net 核心项目中使用 masstransit saga,但我找不到任何文档或(最佳实践)示例来处理异常。

如果我的消费者有错误,我是否应该发布一些失败的事件并使用它。其实我认为这不是一个好的解决方案。所以我想在 Masstransit Statemachine 中抛出异常并捕获。

OrderReceivedConsumer.cs


OrderSaga.cs

我应该在哪里使用 Automatonymous 库“Catch”方法?

0 投票
1 回答
2020 浏览

azure - Azure 容器实例显然在停止或删除后继续运行

我们有一个使用 Azure ServiceBus 的基于微服务的应用程序。我们将其中一项服务(传奇管理器)部署为 .Net Core 控制台应用程序在 docker 容器 (Linux) 中。我们使用 docker-compose 并将一组 2 个容器(包括控制台应用程序)部署到 Azure 容器实例中。

我们使用 MassTransit 与 Azure ServiceBus 一起工作。

控制台应用程序(传奇管理器)通过 MassTransit.BusControlExtensions.Start() 方法启动服务总线。

在这一点上,控制台应用程序(传奇管理器)或多或少已经准备就绪。

旁注:有问题的应用程序(传奇经理)运行自动状态机

现在,如果我们使用 saga 管理器停止删除容器,然后重新启动它 - 它会停止接收总线消息。

似乎每次重新启动都会创建一个新的传奇管理器实例(线程?) - 而旧实例(线程?)以某种方式持续存在

即使我们在 Azure 上完全删除了容器实例资源——我们仍然可以观察到总线消息被某些东西拾取......

删除容器组本身后,容器的应用程序仍然存在

有没有办法彻底杀死分离的实例/线程?

有人熟悉 Azure容器实例的这种行为吗?

PS 在所描述的场景中,停止/删除操作总是成功的

PS2:这是使用az container create命令部署有问题的容器组的 yaml 文件:

也许这是一个重星政策问题?

0 投票
2 回答
1694 浏览

masstransit - 如何在 Masstransit 状态机传奇中正确设置活动?

几天来,我一直在与这个问题作斗争,但找不到真正有效的方法。

我的场景是我有一个状态机 saga,我想在运行 saga 的同一个事务(实体框架)中做一些事情,这样状态和业务就可以在一起了。

现在,我知道状态机本身不应该有任何依赖关系,因此Activity(x => x.OfInstanceType<MyActivity>)可以添加这个活动,它是从 DI 容器解析的,并且可以在其中包含任何依赖项(服务等)。到目前为止,一切都很好...

我的问题是,无论我在活动中执行什么,我都无法让它正常工作。它从容器中解析并Execute调用该方法,但随后它以某种方式退出。
似乎抛出了一些异常,但这显然不会冒泡到测试工具中。

我正在使用微软的 dotnet core Dependency Injection 库。

这是一些代码

0 投票
1 回答
171 浏览

masstransit - 在新的传奇中重新处理特定的公共交通消息并最终确定当前

我正在使用带有 sagas 的 Masstransit 5.1.4。我有一个传奇,我想实现以下行为:

  • 当收到 StartMsg 时 -> 转换到 Active 状态
  • 处于活动状态时,会处理几个事件
  • 如果在此状态下接收到 StartMsg,则当前 saga 已完成并在新的 saga 实例中重新处理 StartMsg

我怎样才能做到这一点?

这是一个小伪代码

0 投票
0 回答
1758 浏览

masstransit - 如何获取多个 Masstransit 状态机实例来处理正确的消息

我正在使用基于https://github.com/MassTransit/Sample-ShoppingWeb的 MassTransitStateMachine 示例。如果我只运行一个状态机应用程序,一切正常。但是,当我运行多个状态机应用程序实例时,似乎错误的状态机应用程序正在处理来自消费者的消息。

即StateMachineA 向ConsumerA 发送命令。ConsumerA 消费和发布的事件。该事件没有路由到 StateMachineA,而是被发送到 StateMachineB。

我想在多个容器中部署状态机,但我无法通过这个。

我试图用谷歌搜索这个主题,但似乎很难找到关于 MassTransitStateMachine 的示例或讨论。或者也许我没有足够地阅读文档。

命令和事件

客户

状态机

消费者

我预计如果我启动多个 AutocallablePricingStateMachine 应用程序,它将消耗来自消费者的事件,该事件处理了由同一个 AutocallablePricingMachine 应用程序(或 pod/容器)发送的命令。