对于长时间运行的基于消息的请求,我们可以在队列级别设置可见性超时,但是似乎没有一种方法可以在消息级别覆盖它。我希望能够延长长时间运行的时间,而不仅仅是设置整个队列的超长超时。基础SQS服务提供ChangeMessageVisibility函数,但未公开。据我所知,RedisMQ根本不支持该概念。
答案 0 :(得分:1)
Redis MQ与Amazon SQS或ServiceStack的Amazon SQS MQ无关,只是它们是ServiceStack的Messaging APIs的不同具体实现,但ServiceStack AppHost只能注册1个IMessageService
所以我不明白使用Redis MQ与您使用Amazon SQS有什么关系?
Redis MQ建立在Redis的List和Pub / Sub原语之上,并且不包含任何此类MQ定制。
如果您仅指的是Amazon SQS MQ,那么您可以使用RegisterHandler overload来为每种消息类型指定visibilityTimeoutSeconds
,这样您就可以使用其他请求DTO类型执行长期运行的请求。我的建议是保持它们孤立。 ServiceStack的Auto Mapping使在具有相同架构的请求DTO之间进行转换变得容易,例如:
public object Any(MyRequest request) { ... }
public object Any(LongRunning request) => Any(request.ConvertTo<MyRequest>());
SqsMqServer
确实具有RequestFilter
和ResponseFilter
,可用于检查ServiceStack MQ返回的IMessage<T>
,可用于更改SQS中发送的元数据消息,但不是其任何自定义消息级别属性。
要启用对SQS的细粒度访问,我在this commit中的SqsMqServer
,SqsMqMessageFactory
和SqsMqClient
中添加了以下过滤器,可让您拦截和自定义来自Amazon SQS的请求:
Action<SendMessageRequest,IMessage> SendMessageRequestFilter { get; set; }
Action<ReceiveMessageRequest> ReceiveMessageRequestFilter { get; set; }
Action<Amazon.SQS.Model.Message, IMessage> ReceiveMessageResponseFilter { get; set; }
Action<DeleteMessageRequest> DeleteMessageRequestFilter { get; set; }
Action<ChangeMessageVisibilityRequest> ChangeMessageVisibilityRequestFilter { get; set; }
此更改可从v5.4.1(现在为available on MyGet)中获得。