如何连续在ASP.NET Core应用程序中监听Pub / Sub消息?

时间:2017-10-17 12:23:45

标签: c# asp.net-core google-cloud-platform google-cloud-pubsub

我想实现一个ASP.NET核心API,它不响应HTTP请求,但是在启动时开始收听Google Cloud Pub / Sub消息,并且它会在其整个生命周期内无限期地进行监听。

使用官方Pub / Sub SDK实现此目的的首选方法是什么?

我可以想到两种方式:

方法1 :只需使用SimpleSubscriber,并在Startup.Configure开始收听消息:

public void Configure(IApplicationBuilder app)
{
    var simpleSubscriber = await SimpleSubscriber.CreateAsync(subscriptionName);
    var receivedMessages = new List<PubsubMessage>();

    simpleSubscriber.StartAsync((msg, cancellationToken) =>
    {
        // Process the message here.

        return Task.FromResult(SimpleSubscriber.Reply.Ack);
    });

    ...
}

方法2 :使用专门创建的库来定期运行作业,例如Quartz,Hangfire或FluentScheduler,每次触发作业时,使用{{1}拉新消息}。

哪一个是首选方法?第一个似乎更简单,但我不确定它是否真的可靠。

1 个答案:

答案 0 :(得分:2)

第一种方法肯定是如何使用它。

但是,请参阅StartAsync的文档:

  

开始接收消息。返回的Task完成时   如果不可恢复,则会调用StopAsync(CancellationToken)   发生故障。此方法不能多次调用   SimpleSubscriber实例。

因此,您需要在不可恢复的错误上处理意外的StartAsync关闭。最简单的方法是使用外部循环,尽管考虑到这些错误被认为是不可恢复的,但可能需要在成功之前更改调用。

代码可能如下所示:

while (true)
{
    // Each SimpleSubscriber instance must only be used once.
    var simpleSubscriber = await SimpleSubscriber.CreateAsync(subscriptionName);
    try
    {
        await simpleSubscriber.StartAsync((msg, cancellationToken) =>
        {
            // Process the message here.
            return Task.FromResult(SimpleSubscriber.Reply.Ack);
        });
    }
    catch (Exception e)
    {
        // Handle the unrecoverable error somehow...
    }
}

如果这不按预期方式运作,请let us know