Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nservicebus saga超时_C#_Nservicebus_Msmq_Nservicebus Sagas - Fatal编程技术网

C# Nservicebus saga超时

C# Nservicebus saga超时,c#,nservicebus,msmq,nservicebus-sagas,C#,Nservicebus,Msmq,Nservicebus Sagas,我有一个传奇,每30秒检查一次API调用的状态,如果调用返回的状态成功,传奇就结束了,如果没有 故事等待30秒,然后再次尝试。如果API调用在60分钟内未返回成功响应,则事件将超时并结束 我在获得60分钟的开火超时时间时遇到问题。我的密码是 public class MonitorSubmissionFeedSagaData: IContainSagaData { public Guid Id { get; set; } public string Originator { g

我有一个传奇,每30秒检查一次API调用的状态,如果调用返回的状态成功,传奇就结束了,如果没有 故事等待30秒,然后再次尝试。如果API调用在60分钟内未返回成功响应,则事件将超时并结束

我在获得60分钟的开火超时时间时遇到问题。我的密码是

public class MonitorSubmissionFeedSagaData: IContainSagaData
{
    public Guid Id { get; set; }

    public string Originator { get; set; }

    public string OriginalMessageId { get; set; }

    public bool TimeoutSet { get; set; }

    [Unique]
    public string JobId { get; set; }
}

public class MonitorSubmissionFeedSaga : Saga<MonitorSubmissionFeedSagaData>,
    IAmStartedByMessages<MonitorFeedSubmissonCommand>,
    IHandleMessages<StartCheckSubmissionCommand>,
    IHandleTimeouts<MonitorSubmissionFeedSagaTimeout>
{
    public const int SagaTimeoutInMinutes = 60;

    public IEmpathyBrokerClientApi PostFileService { get; set; }

    protected override void ConfigureHowToFindSaga(SagaPropertyMapper<MonitorSubmissionFeedSagaData> mapper)
    {
        mapper.ConfigureMapping<MonitorFeedSubmissonCommand>(x => x.JobId).ToSaga(saga => saga.JobId);

    }

    public void Handle(MonitorFeedSubmissonCommand message)
    {
        Data.JobId = message.JobId;

        CheckTimeout();

        Bus.Send(new StartCheckSubmissionCommand
        {
            JobId = Data.JobId
        });
    }

    public void Handle(StartCheckSubmissionCommand message)
    {
        Log.Info("Saga with JobId {0} received", Data.JobId);

        bool isCompleted = GetJobStatus(message.JobId);

        while (isCompleted)
        {
            Thread.Sleep(30000);
            isCompleted = GetJobStatus(message.JobId);
        }

        MarkAsComplete();
    }

    public void CheckTimeout()
    {
        RequestTimeout<MonitorSubmissionFeedSagaTimeout>(TimeSpan.FromMinutes(SagaTimeoutInMinutes));
    }

    public void Timeout(MonitorSubmissionFeedSagaTimeout state)
    {
        MarkAsComplete();
    }

    bool GetJobStatus(string jobId)
    {
        return false;
        var status = PostFileService.GetJobIdStatus(jobId);
        if (status.state == "FAILURE" || status.state == "DISCARDED")
        {
            return false;
        }
        return true;
    }

}
公共类监视器提交FeedSagaData:IContainSagaData
{
公共Guid Id{get;set;}
公共字符串发起者{get;set;}
公共字符串OriginalMessageId{get;set;}
公共bool timestart{get;set;}
[独一无二]
公共字符串JobId{get;set;}
}
公共类监视器提交FeedSaga:Saga,
我开始发短信,
我的手机短信,
我和莱蒂梅奥特
{
公共常数int sagatimeouthines=60;
公共IEmpathyBrokerClientApi PostFileService{get;set;}
受保护覆盖无效配置如何查找Saga(SagaPropertyMapper映射器)
{
配置映射(x=>x.JobId).ToSaga(saga=>saga.JobId);
}
公共无效句柄(MonitorFeedSubmitsCommand消息)
{
Data.JobId=message.JobId;
CheckTimeout();
Bus.Send(新建STARTCHECKSUBSMISSION命令
{
JobId=Data.JobId
});
}
公共无效句柄(StartCheckSubmissionCommand消息)
{
Log.Info(“接收到JobId为{0}的Saga”,Data.JobId);
bool isCompleted=GetJobStatus(message.JobId);
while(已完成)
{
睡眠(30000);
isCompleted=GetJobStatus(message.JobId);
}
MarkAsComplete();
}
公共无效检查超时()
{
请求超时(TimeSpan.FromMinutes(SagatimeOutingMinutes));
}
公共无效超时(MonitorSubmissionFeedSagaTimeout状态)
{
MarkAsComplete();
}
bool GetJobStatus(字符串jobId)
{
返回false;
var status=PostFileService.GetJobIdStatus(jobId);
如果(status.state==“FAILURE”| | status.state==“DISCARDED”)
{
返回false;
}
返回true;
}
}
谁能看出我错在哪里


谢谢

你的传奇故事应该没用了。你用一个while循环让它保持活力。超时消息到达某个点,然后您应该检查应该发生什么。另一个结帐或标记完成

我是在记事本上写的,所以可能无法编译。但这是为了得到一个想法

public class MonitorSubmissionFeedSagaData: IContainSagaData
{
public Guid Id { get; set; }
public string Originator { get; set; }
public string OriginalMessageId { get; set; }

[Unique]
public string JobId { get; set; }
public DateTime SagaStartTimeUtc { get; set; }
}

public class MonitorSubmissionFeedSaga : Saga<MonitorSubmissionFeedSagaData>,
    IAmStartedByMessages<MonitorFeedSubmissonCommand>,
    IHandleTimeouts<VerifyApiTimeOut>
{
public IEmpathyBrokerClientApi PostFileService { get; set; }

public void Handle(MonitorFeedSubmissonCommand message)
{
    Data.JobId = message.JobId;
    Data.SagaStartTimeUtc = DateTime.NowUtc;

    CreateTimeoutRequest();
}

public void CreateTimeoutRequest()
{
    RequestTimeout<VerifyApiTimeOut>(TimeSpan.FromSeconds(30));
}

public void Timeout(VerifyApiTimeOut state)
{
    if (!GetJobStatus(Data.JobId) && DateTime.NowUtc < Data.SagaStartTimeUtc.AddMinutes(60))
    {
      CreateTimeoutRequest();
    }

    MarkAsComplete();
}

bool GetJobStatus(string jobId)
{
    return false;
    var status = PostFileService.GetJobIdStatus(jobId);
    if (status.state == "FAILURE" || status.state == "DISCARDED")
    {
        return false;
    }
    return true;
}

}
公共类监视器提交FeedSagaData:IContainSagaData
{
公共Guid Id{get;set;}
公共字符串发起者{get;set;}
公共字符串OriginalMessageId{get;set;}
[独一无二]
公共字符串JobId{get;set;}
公共日期时间SagaStartTimeUtc{get;set;}
}
公共类监视器提交FeedSaga:Saga,
我开始发短信,
我和莱蒂梅奥特
{
公共IEmpathyBrokerClientApi PostFileService{get;set;}
公共无效句柄(MonitorFeedSubmitsCommand消息)
{
Data.JobId=message.JobId;
Data.sagastartimeutc=DateTime.NowUtc;
CreateTimeoutRequest();
}
public void CreateTimeoutRequest()
{
请求超时(TimeSpan.FromSeconds(30));
}
公共无效超时(VerifyApiTimeOut状态)
{
如果(!GetJobStatus(Data.JobId)&&DateTime.NowUtc
另一个评论可能是,这部传奇本身不应该求助于外部服务。最好连数据库都不要。将此委托给其他服务。每30秒,向另一个处理程序发送一条消息。这个处理程序应该调用WebService/WebAPI。当它可以确认一切都是正确的,回复原始传说。如果不正确,就顺其自然吧。该传奇将每30秒发送一次消息以重试


60分钟后,传奇应该停止发送消息,并标记为完成。

您的传奇应该闲置。你用一个while循环让它保持活力。超时消息到达某个点,然后您应该检查应该发生什么。另一个结帐或标记完成

我是在记事本上写的,所以可能无法编译。但这是为了得到一个想法

public class MonitorSubmissionFeedSagaData: IContainSagaData
{
public Guid Id { get; set; }
public string Originator { get; set; }
public string OriginalMessageId { get; set; }

[Unique]
public string JobId { get; set; }
public DateTime SagaStartTimeUtc { get; set; }
}

public class MonitorSubmissionFeedSaga : Saga<MonitorSubmissionFeedSagaData>,
    IAmStartedByMessages<MonitorFeedSubmissonCommand>,
    IHandleTimeouts<VerifyApiTimeOut>
{
public IEmpathyBrokerClientApi PostFileService { get; set; }

public void Handle(MonitorFeedSubmissonCommand message)
{
    Data.JobId = message.JobId;
    Data.SagaStartTimeUtc = DateTime.NowUtc;

    CreateTimeoutRequest();
}

public void CreateTimeoutRequest()
{
    RequestTimeout<VerifyApiTimeOut>(TimeSpan.FromSeconds(30));
}

public void Timeout(VerifyApiTimeOut state)
{
    if (!GetJobStatus(Data.JobId) && DateTime.NowUtc < Data.SagaStartTimeUtc.AddMinutes(60))
    {
      CreateTimeoutRequest();
    }

    MarkAsComplete();
}

bool GetJobStatus(string jobId)
{
    return false;
    var status = PostFileService.GetJobIdStatus(jobId);
    if (status.state == "FAILURE" || status.state == "DISCARDED")
    {
        return false;
    }
    return true;
}

}
公共类监视器提交FeedSagaData:IContainSagaData
{
公共Guid Id{get;set;}
公共字符串发起者{get;set;}
公共字符串OriginalMessageId{get;set;}
[独一无二]
公共字符串JobId{get;set;}
公共日期时间SagaStartTimeUtc{get;set;}
}
公共类监视器提交FeedSaga:Saga,
我开始发短信,
我和莱蒂梅奥特
{
公共IEmpathyBrokerClientApi PostFileService{get;set;}
公共无效句柄(MonitorFeedSubmitsCommand消息)
{
Data.JobId=message.JobId;
Data.sagastartimeutc=DateTime.NowUtc;
CreateTimeoutRequest();
}
public void CreateTimeoutRequest()
{
请求超时(TimeSpan.FromSeconds(30));
}
公共无效超时(VerifyApiTimeOut状态)
{
如果(!GetJobStatus(Data.JobId)&&DateTime.NowUtc
另一个评论可能是,这部传奇本身不应该求助于外部服务。最好连数据库都不要。将此委托给其他服务。每30秒,向另一个处理程序发送一条消息。这个处理程序应该调用WebService/WebAPI。当它可以确认一切都是正确的,回复原始传说。如果不正确,就顺其自然吧。这一传奇将传开