问题标签 [nservicebus-sagas]

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 投票
1 回答
642 浏览

nservicebus - 将 [Unique] 属性应用于 IContainSagaData 属性后的现有 saga 实例

我有一堆处于长期运行过程的各种状态的现有 sagas。

Saga.UniqueAttribute最近,我们决定通过使用(更多关于这里http://docs.particular.net/nservicebus/nservicebus-sagas-and-concurrency)来使我们的 IContainSagaData 实现上的属性之一独一无二。

部署更改后,我们意识到没有找到所有旧的 saga 实例,并且在进一步挖掘(感谢 Charlie!)后发现,通过添加唯一属性,我们需要对 Raven 中的所有现有 saga 进行数据修复。

现在,这很糟糕,有点像在数据库列中添加索引,然后发现所有表数据不再可选择,但既然如此,我们决定创建一个工具来执行此操作。

因此,在创建并运行此工具之后,我们现在已经修补了旧的 sagas,使它们现在类似于新的 sagas(自从我们接受更改后创建的 sagas)。

然而,尽管所有数据现在看起来都正确,但我们仍然无法找到该传奇的旧实例!

我们编写的工具做了两件事。对于每个现有的 saga,该工具:

  1. 将一个名为“NServiceBus-UniqueValue”的新 RavenJToken 添加到 saga 元数据中,将值设置为与该 saga 的唯一属性相同的值,并且
  2. 创建一个 NServiceBus.Persistence.Raven.SagaPersister.SagaUniqueIdentity 类型的新文档,相应地设置 SagaId、SagaDocId 和 UniqueValue 字段。

我的问题是:

  1. 仅仅使数据看起来正确就足够了,还是我们需要做其他事情?
  2. 我们的另一个选择是还原添加了唯一属性的更改。但是,在这种情况下,自从更改发生以来创建的那些新 sagas 是否可以接受?

添加元数据令牌的代码:

添加新文档的代码:

非常感谢任何帮助。

编辑

感谢 David 在这方面的帮助,我们解决了我们的问题 - 关键区别在于我们使用SagaUniqueIdentity.FormatId()来生成文档 ID 而不是新的 guid - 这是微不足道的,因为我们已经引用了 NServiceBus 和 NServiceBus.Core 程序集。

0 投票
1 回答
85 浏览

batch-file - NServiceBus Sagas:一起批量处理项目?

标题可能不太适合我的要求,但我想不出一个好的表达方式。

本质上,我正在设计一个系统,其中事务进入系统,经过验证,应用业务规则并将事务持久化到数据库中。每个事务都有一个已定义的键,所以我正在考虑创建一个实现控制器模式并定义这些步骤的 saga。

然而,问题出现在数据的定时传输之后。我可能有数千个不同的交易需要在指定的截止时间传输给不同的合作伙伴。我需要指定合作伙伴的所有交易都在该合作伙伴的文件中。我没有看到的是如何让所有具有单个 saga 的交易同时触发和收集。

我正在考虑实施超时以使每个事务在其截止时间触发,但是我如何将所有事务收集在一起?

我正在研究的一个选项是使用 Quartz.Net 设置定时作业以在每个截止时间运行,然后让该作业将消息发布回 saga 并使用 ConfigureHowToFindSaga 函数更新事务的状态。我只是不确定这是最好的实现。

0 投票
1 回答
159 浏览

c# - NServiceBus:文档'' 不再存在并且可能已被删除

我正在尝试:从端点获取消息。该消息将包含序列化的 MessageClass。只有当 MessageClass.MessageIdentifier 是唯一的时,我才想开始一个新的传奇。

我的传奇是这样的:

这是佐贺数据:

这是总线配置:

当我运行我的端点时,控制台会显示警告:

但是,如果我删除语句:

然后整个应用程序运行良好,但新的 Saga 正在为相同的消息创建。我知道这一点,因为 RecordNewMessage() 将写入 DB,并且我看到同一 MessageClass.MessageIdentifier 的多个插入。

0 投票
1 回答
304 浏览

nservicebus - NServiceBus :取消计划任务

我创建了一个计划任务

现在,如果我的 saga 的 Handle() 被执行 MarkAsComplete() 的传入消息调用,我创建的计划任务不会被取消。

如何取消任务?

0 投票
1 回答
962 浏览

request - 在 SAGA NserviceBus 中使用请求/回复

我正在 NServiceBus 中创建一个 SAGA。这个传奇正在处理一些必须转换然后验证并最终导入的字符串。这三个动作是独立的服务。我希望这些操作作为 NServiceBus 中的单独处理程序。我正在使用 NServiceBus 中的请求/回复功能。像这样:

transformationHandler 如下。

我的问题如下。当请求发送到 transformationHandler 时。一条消息被发送到消息队列。然后假设,服务器崩溃。服务器重新启动,服务器获取 TransformationRequest,它是否工作并想要回复 Saga,但如何?传奇不再存在,无法处理.Register。我该如何处理这个问题?

谢谢你。

0 投票
1 回答
318 浏览

nservicebus - NServiceBus:传奇超时后存储队列中的消息数量增加

首先有关设置的一些信息:

  • 我们正在运行 NServiceBus v4.6.3
  • 分发器在具有集群队列的集群机器上运行。
  • TimeoutManager 在工作人员上禁用,在分发服务器上启用。


我们正在经历什么

  • 当处理 Saga-timeout 时,存储队列中的消息数会增加 1。
  • 当消息被延迟时,存储队列中的消息数量会增加一。


我们知道什么

超时消息直接传送到特定的本地队列(在请求超时的服务器上),而不是集群队列。这绕过了常规路径,该路径涉及从存储队列中删除消息并将目标队列传递到工作线程。工作人员不知道这一点,并在处理超时消息后报告它已准备好处理新消息。

这种行为的原因是存储在 TimeoutData 中的目标队列被设置为工作器上的本地队列,而不是集群队列。这是一个例子:


我不确定我们遇到的是 NServiceBus 中的错误或配置错误。有人知道吗?

0 投票
1 回答
625 浏览

nhibernate - NServiceBus 4.6.5 NHibernate Saga Persister 不持久化 Saga 数据

我将 NServiceBus 与 NHibernate 一起使用,并在我自己的进程中托管总线。我正在使用的配置是:

和:

此配置在我的 SQL Server 数据库中为我的 saga 创建表,其中包含我在我的 saga 中指定的字段,这很棒。

但是,当我的 Saga 运行并完成时,NServiceBus 似乎没有将记录插入到我的 saga 表中。

表格在那里,只是没有数据。

这应该预期吗?saga 成功完成后,NServiceBus 是否会删除持久性中的 saga 条目?

0 投票
0 回答
734 浏览

c# - NServicebus Sagas: SagaNotFound 警告,即使它找到它

我希望有人可以帮助我解决我的问题,因为我已经疯狂地用谷歌搜索它,但没有结果。

我正在尝试在 NServicebus 中实现一个传奇。saga 中的 handle 方法使用 bus.Send() 方法通过总线调用两个不同的处理程序(参见下面的代码)。然后,当每个处理程序完成其工作时,它会以相同的方式将通知消息发送回 saga。saga 检查其状态并在所有步骤完成后调用 MarkAsComplete()。在这个传奇中,我使用一个消息队列和端点进行所有通信。

在到达方法 public void Handle(Notify1DataMessage message) 和 public void Handle(Notify2DataMessage message) 之前,每个处理程序都会收到以下两条警告行:


警告:找不到 ID [GUID] 的消息类型 Notify1Message 的 saga。将调用 SagaNotFoundHandlers。

警告:NServiceBus.Sagas.SagaPersistenceBehavior:找不到消息类型命名空间的传奇。Notify1Message 与 id [GUID]。将调用 SagaNotFoundHandlers。


我究竟做错了什么?一切正常,它在 saga 中找到了通知句柄方法,但为什么会抱怨?

相关代码:

0 投票
2 回答
1057 浏览

nservicebus - 如何使 Saga 消息句柄等待另一个句柄在 NService Bus 中完成

我们最近开始在我们的项目中实现 Nservice 总线。我们是 Saga Service 的新手,我们对以下情况感到震惊。

假设我们的 saga 中有 4 个步骤,saga 将由 message1 启动。

消息 2 将由一些外部服务触发。我们必须在message1处理完成后才对message2进行一次处理,这可以运行很长时间。

我们怎样才能做到这一点?除了在 message2 句柄上使用 Thread.Sleep或类似具有通用方法的东西之外,该方法将在检查 message1 完成后在消息 2 到达时调用,并在检查消息 2 到达后在消息 1 处理结束时调用。

我们没有使用服务矩阵。

提前致谢。

0 投票
1 回答
1013 浏览

c# - NServiceBus Saga 多次处理消息类型给出并发异常

我们有一个处理多种消息类型的 NServiceBus 实现:

MessageData 是这样的:

CreateMessage 有一个 MessagePart,它在其处理程序中添加到 MessageParts。ConfirmMessage 更新特定 MessagePart 的状态。

这是场景:

1) 接收到第一个 CreateMessage。这将在 Raven 中创建 Saga,并将 MessagePart(状态为“1”)添加到 MessageParts。

2) 接收到第一个 ConfirmMessage。这会将 Saga 中第一个添加的 MessagePart 的状态更新为“1 2”。转到 RavenDB 中的文档时,可以在浏览器中看到这一点。

3) 接收到第二个 CreateMessage。这会向 MessageParts 添加第二个 MessagePart。查看数据时,第一个 MessagePart 的状态仍然是“1”而不是“1 2”,这会引发并发异常(ActualETag 不等于 ExpectedETag):

看起来 Saga 数据是按消息类型缓存的。是这样吗?有解决办法吗?

笔记:

我们正在使用多个 IAmStartedByMessages,但是当 ConfirmMessage 在 CreateMessage 之前时,此消息将被添加到队列中,直到 CreateMessage 被处理。