C# 不带接收器外观的事务性消息-会话窥视
我有一个分布式服务,处理一条消息需要10秒到10分钟的时间。该服务根据通过API接收的用户(=浏览器)请求启动。由于各种限制,服务的结果必须在初始请求之外返回(超时、断开的客户端连接…),因此我向请求用户返回一个SessionId,该SessionId可用于检索结果,直到结果过期 现在,当会话仍处于锁定状态时,用户可能会连续多次请求结果。例如,以下代码在60秒内被相同的SessionId命中:C# 不带接收器外观的事务性消息-会话窥视,c#,asp.net,azure,servicebus,C#,Asp.net,Azure,Servicebus,我有一个分布式服务,处理一条消息需要10秒到10分钟的时间。该服务根据通过API接收的用户(=浏览器)请求启动。由于各种限制,服务的结果必须在初始请求之外返回(超时、断开的客户端连接…),因此我向请求用户返回一个SessionId,该SessionId可用于检索结果,直到结果过期 现在,当会话仍处于锁定状态时,用户可能会连续多次请求结果。例如,以下代码在60秒内被相同的SessionId命中: var session = await responseQueue.AcceptMessageSess
var session = await responseQueue.AcceptMessageSessionAsync(sessionId);
var response = await session.ReceiveAsync(TimeSpan.FromSeconds(60));
if (response == null)
{
session.Abort();
return null;
}
await response.AbandonAsync();
我需要的是一个没有锁定的设置,能够多次读取消息,直到消息过期,再加上能够等待尚未存在的消息
哪种ServiceBus解决方案适合这一需求
更新
这是一个肮脏的解决方案,仍在寻找更好的方法:
MessageSession session = null;
try
{
session = await responseQueue.AcceptMessageSessionAsync(sessionId);
}
catch
{
// ... and client has to try again until the 60 sec lock from other requests is released
}
var response = await session.ReceiveAsync(TimeSpan.FromSeconds(60));
// ...