我有以下类在aws sns队列上发布消息" TryRestart()":
internal class SmsReceptionTestRunner : ITestRunner<ConfigurationViaSmsAttempt>
{
private readonly CommunicationClient _communicationClient;
public SmsReceptionTestRunner(CommunicationClient communicationClient)
{
_communicationClient = communicationClient;
}
public Test Execute(ConfigurationViaSmsAttempt MessageType)
{
// publish
_communicationClient.ConfigurationService.TryRestart(MessageType.Imei);
// wait five minutes ...
return new Test("6", "", false, MessageType.TargetApn, MessageType.TargetApn);
}
}
一个单独的处理程序类在队列上发布时会处理答案 - 通常需要大约五分钟 - await Task.Delay(TimeSpan.FromMinutes(5));
。 5分钟后。如果没有处理任何消息,我将新的测试集保存为false。:
public class RestartViaSmsAttemptHandler : IHandler<RestartViaSmsAttempt>
{
private readonly IRepository<Test> _TestRepository;
public RestartViaSmsAttemptHandler(IRepository<Test> TestRepository)
{
_TestRepository = TestRepository;
}
public bool Handle(RestartViaSmsAttempt message)
{
var test = new Test("6", message.Imei, true, "", "");
_TestRepository.Save(test);
return true;
}
}
我想放置一种机制,以防止// wait five minutes
位仅在我的处理程序从队列中收回消息时才会运行。
基本上,我要求重新启动,5分钟后,如果没有答案,我知道出了问题。
答案 0 :(得分:0)
你可以像这样早点中止等待:
await Task.WhenAll(someTask, TimeSpan.FromMinutes(5));
当someTask
完成后,等待结束。您可以使用TaskCompletionSource
生成要随意完成的任务。
因此,如果您收到回复,则完成任务并结束等待。
您确定需要消息队列吗?您基本上是通过消息队列运行同步调用。也许你需要一个普通的网络服务电话。