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

0 投票
0 回答
417 浏览

handler - NServiceBus Saga 找不到处理程序,因为它使用了错误的 ID

我正在使用 NSB 4。我有一个具有以下内容的传奇

BasSaga 只是包装了 saga。我不知道为什么我现在有更大的鱼要炸。

然后我有

我的 OrderSagaData 看起来像这样

供应商创建消息

然后终于在我的日志中我得到了

找不到 ID 为 7af7dff2-bf03-4ebd-9e6c-a27a01125ceb 的消息类型 Messages.Vendors.VendorCreatedMessage 的传奇。将调用 SagaNotFoundHandlers。

该消息是正确的名称空间,但 id (7af7) 不仅是错误的 id,而且我在其他任何地方都找不到。它不在供应商服务日志或传奇日志中。当我查看队列时,供应商服务正在发送正确的 SagaId。

我很困惑,不知道它在哪里变得奇怪(7af7)id 或者为什么它没有使用正确的 sagaid。

任何帮助,将不胜感激。

0 投票
1 回答
216 浏览

masstransit - 使用 NHibernate 在公共交通中的持久 Sagas - 服务重启后会发生什么?

我已经从使用 saga 转移InMemorySagaRepository到使用,NHibernateSagaRepository以便在服务重新启动时我的 sagas 是持久的。

我可以看到我的 saga 被持久化到数据库中,并且 saga 的状态被保存在一个表列中。

如果我在处理 saga 时停止服务然后重新启动它会发生什么?

我的期望是传奇会从它停止的地方重新开始,但这并没有发生。在服务重启后,我需要做些什么来让我的 sagas 继续处理吗?

谢谢!

0 投票
1 回答
611 浏览

c# - 如何为 NServicebus 的 NHibernate Saga Persister 使用 Version 属性?

请原谅我提出了一个可能有完全明显答案的问题 (RTFM),但是如何使这里提到的“版本属性”真正起作用?此处提供的 Ayende 网站链接和此处的 github 存储库暗示这是可能的。这里还有另一个 SO 链接,它描述了相同的问题,但并没有真正发布明确的解决方案。我也无法在与此功能相关的发行说明或文档中找到 NSB 示例代码或任何内容。但是,对于使用多个工作线程和 ReadCommited 运行 sagas 的任何人来说,这都是至关重要的知识。

是否真的像将一个名为 Version 的整数属性添加到您的 saga 数据类和一个时间戳/行版本到您的 saga 数据表一样简单?这真的在某个地方的样本中,我只是没有找对地方吗?

此外,根据我看到的评论,NSB 3.x 中似乎存在一个涉及此功能的错误。我是否需要升级到 4.x 才能获得此功能,或者是否有一种简单的方法可以让它在 3.x 中工作?

谢谢!

编辑:

使用下面约翰西蒙的回答,我最初使用以下 NSB 版本遇到了一个错误:

在 github 上打开了这个问题,经过一番来回后,尝试了一个包含修复的开发版本并让它工作。官方修复在 NServiceBus.NHibernate v4.4.0 中发布。

我对答案的变体是将其与时间戳 SQL 列一起使用:

经过几天的锤击,它看起来不错。

0 投票
0 回答
714 浏览

testing - 测试 Bus.Send()

我有这个方法:

我想测试消息是否已正确发送,我正在通过以下测试执行此操作:

但是当这样做时,我得到以下异常:

当我查看队列时,我看到已经添加了一个。

现在我的问题是如何通过测试检查它是否已正确发送。我可能忘了在配置中做些什么?

感谢您的时间。

0 投票
1 回答
71 浏览

nservicebus - NServiceBus 传奇在多个服务器上传播

我有一个复杂的业务逻辑流程,其中包括 4 个不同的服务器(每个服务器执行流程的不同部分)。我对每台服务器都使用了 WCF Web 服务。

现在我想在这个过程中使用 NServiceBus。saga 功能听起来正是我所需要的,但我一直不明白如何实现这个过程——我是否需要在 saga 中创建处理程序,以便他们每个人都会调用 webService?

或者我可以在每台服务器上放置相同的 saga 主机,以便每台服务器都能处理它,这是进程的一部分?

0 投票
3 回答
551 浏览

nservicebus - 有条件地启动 Saga

我有两种类型的事件:

  • 人已改变
  • 人员地址已更改。

当一个新的人(和一个新地址)被创建(创建或更新的种类)时,它们也会被发布。

创建新人员时,会发布两个事件:PersonChanged 和 PersonAddressChanged(按此顺序)。但是,由于NServiceBus是异步的,它们可以按任何顺序处理。并且当地址更改(对于现有人员)时,没有 PersonChanged 事件,只有 PersonAddressChanged 事件。

我想为 PersonAddressChanged 事件编写一个处理程序,它将:

  1. 检查此人是否在数据库中
  2. 如果是,那么只需进行更新
  3. 如果不是,则开始 saga 并等待 PersonChanged 事件(假设它是一个新人)

在 PersonChanged 事件中,我需要将人员插入数据库,找到 saga 并再次运行 PersonAddressChanged 的​​处理程序。

我可以通过 NServiceBus Sagas 实现这一目标吗?我不能假设消息处理应该是有序的,PersonChanged → PersonAddressChanged因为有时任何特定地址更改都不会出现 PersonChanged 事件。

0 投票
0 回答
516 浏览

python - saga_api python 库:引发 AttributeError(“未定义构造函数”)

我正在尝试使用 saga_api 库执行 python 脚本,不幸的是我在第一步中停止了:(。当我托盘在 python 上执行此命令时:aga_api.CSG_Module_Library() 我收到此错误消息:

它在 Windows 上也有同样的效果!

你能不能帮我越过这一步?!

这是代码:

!/usr/bin/env 蟒蛇

导入 saga_api、sys、os

def Import_raster(in__grid):

如果名称== '主要':

打印“完成!”

这是初始化: .... class CSG_Module_Library(_object): swig_setmethods = {} setattr = lambda self, name, value: _swig_setattr(self, CSG_Module_Library, name, value) swig_getmethods = {} getattr = lambda self, name: _swig_getattr (self, CSG_Module_Library, name) def init (self, *args, **kwargs): raise AttributeError("No constructor defined") repr= _swig_repr def is_Valid(self): return _saga_api.CSG_Module_Library_is_Valid(self) def Get_File_Name(self): return _saga_api.CSG_Module_Library_Get_File_Name(self) def Get_Library_Name(self): return _saga_api.CSG_Module_Library_Get_Library_Name(self) def Get_Info(self, *arg): return _saga_api.CSG_Module_Library_Get_Info(self, *args) def Get_Name(self): return _saga_api.CSG_Module_Library_Get_Name(self) def Get_Description(self): return _saga_api.CSG_Module_Library_Get_Description(self) def Get_Author(self): return _saga_api.CSG_Module_Library_ Get_Version(self): return _saga_api.CSG_Module_Library_Get_Version(self) def Get_Summary(self, *args): return _saga_api.CSG_Module_Library_Get_Summary(self, *args) def Get_Count(self): return _saga_api。CSG_Module_Library_Get_Count(self) def Get_Menu(self, *args): return _saga_api.CSG_Module_Library_Get_Menu(self, *args) def Get_Module(self, *args): return _saga_api.CSG_Module_Library_Get_Module(self, *args) def Get_Module_Grid(self, *args) : return _saga_api.CSG_Module_Library_Get_Module_Grid(self, *args) def Get_Module_Interactive(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Interactive(self, *args) def Get_Module_Grid_Interactive(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Grid_Interactive(self, *args) CSG_Module_Library_swigregister = _saga_api.CSG_Module_Library_swigregister CSG_Module_Library_swigregister(CSG_Module_Library) ....*args) def Get_Module_Grid(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Grid(self, *args) def Get_Module_Interactive(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Interactive(self, *args) def Get_Module_Grid_Interactive(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Grid_Interactive(self, *args) CSG_Module_Library_swigregister = _saga_api.CSG_Module_Library_swigregister CSG_Module_Library_swigregister(CSG_Module_Library) ....*args) def Get_Module_Grid(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Grid(self, *args) def Get_Module_Interactive(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Interactive(self, *args) def Get_Module_Grid_Interactive(self, *args): return _saga_api.CSG_Module_Library_Get_Module_Grid_Interactive(self, *args) CSG_Module_Library_swigregister = _saga_api.CSG_Module_Library_swigregister CSG_Module_Library_swigregister(CSG_Module_Library) ....*args) CSG_Module_Library_swigregister = _saga_api.CSG_Module_Library_swigregister CSG_Module_Library_swigregister(CSG_Module_Library) ....*args) CSG_Module_Library_swigregister = _saga_api.CSG_Module_Library_swigregister CSG_Module_Library_swigregister(CSG_Module_Library) ....

0 投票
1 回答
78 浏览

persistence - 替换 NServiceBus.Sagas.Impl.Configure.SagasWereFound

将 NServiceBus 从版本 3 升级到 4 并在编译时出现此错误:

错误 CS0234:命名空间“NServiceBus.Sagas”中不存在类型或命名空间名称“Impl”(您是否缺少程序集引用?)

0 投票
2 回答
1596 浏览

c# - 异步双工WCF+进程管理器

我正在寻找一种方法让客户端调用从客户端 UI 到 WCF 服务主机的异步进程,然后通知客户端进程的状态。我想这可以通过 sagas(流程管理器)、域事件和 WCF 双工连接来实现,但我不确定如何!

案例顺序(我猜)如下:

  1. 客户端调用进程
  2. 客户端创建 WCF 代理
  3. 代理连接到服务主机
  4. 服务主机创建到客户端的双工通道
  5. 服务主机使用命令总线启动进程并通过双工通道
  6. 进程状态改变!
  7. 定位相关双工通道
  8. 推回状态更改
  9. 客户接收状态变化并可视化

我说得对吗?简而言之,相关的类会是什么样子?是的,我知道 NServiceBus(在这种情况下经常被提及),但我不想依赖额外的框架(我已经有很多 NServiceBus 可以自己解决的问题,而且我已经在使用数百个各种东西的不同框架..)

编辑: 示例 这里有一个可能指定我的问题的真实示例。

我有一个图像处理服务器,它可以用图像做一些神奇和独角兽的东西。WCF 客户端将图像上传到服务器,然后显示一个进度条,指示已处理了多少图像。服务器启动一个新的 ImageProcessService(在请求范围内)。在处理过程中,他可能会抛出大量 ImageProcessStateChanged 事件,其中的数字以百分比表示进程。完成后,他可能会抛出一个 ImDoneEvent。所有事件都应该被事件总线捕获,事件总线将它们发回给正确的客户端。该过程最多可能需要 60 秒,并且可以为每个客户端触发一次,但针对尽可能多的客户端。

0 投票
1 回答
449 浏览

c# - NServiceBus 和 nvarchar(max)

我的 Saga 课程如下:

我在 MSSQL 中坚持 Sagas。创建的表结构如下:

Data属性(字符串类型)已映射到nvarchar(255). 显然,当我为该属性分配超过 255 个字符时,它会失败并显示 message: String or binary data would be truncated。我怎么能强迫它nvarchar(max)呢?

我正在使用 NServiceBus 4.4.2。