消防与ServiceStack的AsyncServiceBase忘记(Fire and forget

2019-07-30 01:43发布

我有以下服务

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一样。 但似乎并非如此。

难道我错过了什么?

Answer 1:

AsyncServiceBase已被弃用ExecuteAsync现在在ServiceBase是当一个请求时到/ asynconeway / XXX预先定义的终点是什么被调用。

而不是覆盖ExecuteAsync推荐的方法是实现IMessageFactory是如果一个东西被调用IMessageFactory已经在国际奥委会APPHOST被注册。 如果IMessageFactory没有被注册,比它刚刚被执行同步 - 在这一点,如果你仍然想要它无阻塞你会覆盖它。 对于ExecuteAsync的IMPL是:

// 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的和消息维基为使用内置的Redis IMessageService的端至端解决方案的一个例子。 也有InMemory和RCON IMesssageService的可用,它应该很容易创建自己的为好。

未来异步支持

还有一个异步分支有ServiceStack上运行IHttpAsyncHandler ,已经有可用的功能阿尔法建立你在尝试: ServiceStack-v4.00-alpha.zip

随着这一变化ServiceStack支持Task<>作为服务返回类型。 你只需要注册任务<>插件 。 要查看完整的例子来看一下这个集成测试 。



文章来源: Fire and forget with ServiceStack's AsyncServiceBase