使用 ServiceStack 的 AsyncServiceBase 实现一劳永逸

2024-03-06

我有以下服务

public class AppService : AsyncServiceBase<EvaluateStock>
{
    public IBus Bus { get; set; }

    public override object ExecuteAsync(EvaluateStock request)
    {
        // this will block the incoming http request 
        // unitl task is completed

        // long computation
        // Bus.Publish(result)
    }
}

不同的消费者按照以下方式调用它

POST
http://srv1/app/json/asynconeway/EvaluateStock

使用 asynconeway,我假设它可以让我实现一劳永逸,就像 WCF 使用 IsOneWay 所做的那样。但似乎并非如此。

我错过了什么吗?


异步服务库 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/AsyncServiceBase.cs#L17已被弃用为异步执行 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/ServiceBase.cs#L307现在位于 ServiceBase 中,当发出请求时会调用它/asynconeway/XXX预定义的端点。

而不是压倒一切异步执行建议的方法是实施消息工厂 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Interfaces/Messaging/IMessageFactory.cs如果一个IMessageFactory已在AppHost IOC中注册。如果 IMessageFactory 没有注册,那么它只会执行 Sync - 此时如果您仍然希望它是非阻塞的,您可以覆盖它。 ExecuteAsync 的实现位于:

// Persists the request into the registered message queue if configured, 
// otherwise calls Execute() to handle the request immediately.
// 
// IAsyncService.ExecuteAsync() will be used instead of IService.Execute() for 
// EndpointAttributes.AsyncOneWay requests
public virtual object ExecuteAsync(TRequest request)
{
    if (MessageFactory == null)
    {
        return Execute(request);
    }

    BeforeEachRequest(request);

    //Capture and persist this async request on this Services 'In Queue' 
    //for execution after this request has been completed
    using (var producer = MessageFactory.CreateMessageProducer()) {
        producer.Publish(request);
    }

    return ServiceUtils.CreateResponseDto(request);
}

IMessageFactory(客户端)/IMessageService(服务器)是 ServiceStack 消息传递 API 的一部分,它允许您发布消息以便稍后延迟执行。请参阅Redis 和消息传递 wiki https://github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redis有关使用内置 Redis IMessageService 的端到端解决方案的示例。还有InMemory https://github.com/ServiceStack/ServiceStack/blob/master/tests/ServiceStack.Messaging.Tests/TransientServiceMessagingTests.cs and RCon https://github.com/ServiceStack/ServiceStack/tree/master/src/ServiceStack.Common/Messaging/RconIMesssageService 已可用,并且您也可以轻松创建自己的 IMesssageService。

未来的异步支持

还有一个异步分支 https://github.com/ServiceStack/ServiceStack/tree/async运行 ServiceStack 的IHttpAsyncHandler并且已经有一个功能性的 alpha 版本可供您尝试:ServiceStack-v4.00-alpha.zip https://github.com/downloads/ServiceStack/ServiceStack/ServiceStack-v4.00-alpha.zip

通过此更改,ServiceStack 支持Task<>作为服务的返回类型。您只需注册任务插件 https://github.com/ServiceStack/ServiceStack/blob/async/tests/ServiceStack.Plugins.Tasks.Tests/TaskServiceTest.cs#L46。要查看完整的示例,请查看本次集成测试 https://github.com/ServiceStack/ServiceStack/blob/async/tests/ServiceStack.Plugins.Tasks.Tests/TaskServiceTest.cs.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ServiceStack 的 AsyncServiceBase 实现一劳永逸 的相关文章

随机推荐