gpt4 book ai didi

nservicebus - 有条件地启动 Saga

转载 作者:行者123 更新时间:2023-12-02 21:31:40 26 4
gpt4 key购买 nike

我有两种类型的事件:

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

当创建新人员(和新地址)(类似于创建或更新)时,它们也会被发布。

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

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

  1. 检查此人是否在数据库中
  2. 如果是,则进行更新
  3. 如果没有,则启动 saga 并等待 PersonChanged 事件(假设是新人)

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

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

最佳答案

可以用传奇来做到这一点,是的,尽管你可能不应该这样做。首先,创建和更新人员使用相同的事件会丢失事件中的语义信息(这就是您试图通过检查数据库中的用户来重新创建的信息)。您还使自己面临许多潜在的竞争条件,并且需要考虑如何处理所有这些条件。我的建议是重新设计您的消息流,这可能会让您当前的问题消失。

但是,如果你想尝试一下,你会这样做:(未经测试或编译,只是概念代码)

public class MySaga : Saga<MySagaDataType>, IAmStartedByMessage<PersonChanged>, IAmStartedByMessage<PersonAddressChanged> {
public override void ConfigureHowToFindSaga() {
// How to correlate PersonChanged and PersonAddressChanged messages
}
public void Handle<PersonChanged>(PersonChanged msg) {
Insert(msg);
if(Data.PendingAddressChange != null)
UpdateDatabase(msg);
MarkAsComplete();
}
public void Handle<PersonAddressChanged>(PersonAddressChanged msg) {
if(IsInDatabase(msg.Person)) {
UpdateDatabase(msg);
MarkAsComplete();
}
else {
Data.PendingAddressChange = msg;
}
}
}
public class MySagaDataType : IContainSagaData {
public PersonAddressChanged PendingAddressChange { get; set; }
}

关于nservicebus - 有条件地启动 Saga,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com