NServiceBus 超时管理器

发布于 2024-10-12 21:04:13 字数 1254 浏览 1 评论 0原文

我正在开发一个示例应用程序来使用 NserviceBus 测试 saga 中的超时管理。

我正在尝试实现以下目标

当传奇开始时将超时设置为 1 分钟 在超时发生之前,如果有更新,则将超时更新为 5 分钟 我的代码如下所示,

  public class OrderSaga : Saga<OrderSagaData>,
        IAmStartedByMessages<SampleMessage>,
        IHandleMessages<UpdateMessage>
    {
        public override void ConfigureHowToFindSaga()
        {
            ConfigureMapping<UpdateMessage>(s => s.PurchaseOrderNumber, m => m.Update);
        }

        public void Handle(SampleMessage message)
        {
            this.Data.PurchaseOrderNumber = message.Name;
            RequestTimeout(DateTime.Now.AddMinutes(1), message.Name);
        }


        private void Complete()
        {
            MarkAsComplete();
        }

        public override void Timeout(object state)
        {
            Complete();
        }


        #region IMessageHandler<UpdateMessage> Members

        public void Handle(UpdateMessage message)
        {
            this.Data.PurchaseOrderNumber = message.NewValue;     
            RequestTimeout(DateTime.Now.AddMinutes(5), message.Update);
        }

        #endregion
    }
}

但这里的问题是超时没有更新为 5 分钟。超时仍然有效 1 分钟。

你能让我知道这里出了什么问题吗?

提前致谢, 阿贾伊

I was developing a sample application to test the timeout management in saga using NserviceBus.

I am tryin to achieve the following

When a saga started set it's timeout to 1 minute
Before the timeout happens if an update came to the nessage updates the timeout to 5 minutes
My code is like below

  public class OrderSaga : Saga<OrderSagaData>,
        IAmStartedByMessages<SampleMessage>,
        IHandleMessages<UpdateMessage>
    {
        public override void ConfigureHowToFindSaga()
        {
            ConfigureMapping<UpdateMessage>(s => s.PurchaseOrderNumber, m => m.Update);
        }

        public void Handle(SampleMessage message)
        {
            this.Data.PurchaseOrderNumber = message.Name;
            RequestTimeout(DateTime.Now.AddMinutes(1), message.Name);
        }


        private void Complete()
        {
            MarkAsComplete();
        }

        public override void Timeout(object state)
        {
            Complete();
        }


        #region IMessageHandler<UpdateMessage> Members

        public void Handle(UpdateMessage message)
        {
            this.Data.PurchaseOrderNumber = message.NewValue;     
            RequestTimeout(DateTime.Now.AddMinutes(5), message.Update);
        }

        #endregion
    }
}

But here the problem is the timeout is not getting updated to 5 minutes.The timeout still works for 1 minute.

Could you please let me know what is doing wrong here?

Thanks in advance,
Ajai

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

誰ツ都不明白 2024-10-19 21:04:13

Saga 超时无法更新。无论你做什么他们都会开火。在您的情况下,您将收到两个超时,并且考虑到您在超时处理程序中调用 Complete,您的传奇将在一分钟后结束。您需要添加一些考虑到这一点的逻辑。

像这样的事情可能会做到:

if(!updateReceived or state == ThisTimeoutWasRequestedByMyUpdateHandler)
   Complete();

希望这有帮助!

Saga timeouts can't be updated. They will fire no matter what you do. In your case you will receive both timeouts and given that you call Complete in your timeout handler your saga will end after one minute. You need to add some logic in that takes this into account.

Something like this might do it:

if(!updateReceived or state == ThisTimeoutWasRequestedByMyUpdateHandler)
   Complete();

Hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文