Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET核心应用程序中连续侦听发布/订阅消息?_C#_Asp.net Core_Google Cloud Platform_Google Cloud Pubsub - Fatal编程技术网

C# 如何在ASP.NET核心应用程序中连续侦听发布/订阅消息?

C# 如何在ASP.NET核心应用程序中连续侦听发布/订阅消息?,c#,asp.net-core,google-cloud-platform,google-cloud-pubsub,C#,Asp.net Core,Google Cloud Platform,Google Cloud Pubsub,我想实现一个ASP.NET核心API,它不响应HTTP请求,但在启动时开始侦听Google Cloud发布/订阅消息,并在其生命周期中无限期地侦听 使用官方发布/订阅SDK实现此功能的首选方式是什么 我可以想出两种方法: 方法1:只需使用SimpleSubscriber,然后在启动中。配置开始收听消息: public void Configure(IApplicationBuilder app) { var simpleSubscriber = await SimpleSubscribe

我想实现一个ASP.NET核心API,它不响应HTTP请求,但在启动时开始侦听Google Cloud发布/订阅消息,并在其生命周期中无限期地侦听

使用官方发布/订阅SDK实现此功能的首选方式是什么

我可以想出两种方法:

方法1:只需使用
SimpleSubscriber
,然后在
启动中。配置
开始收听消息:

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);
    });

    ...
}
public void配置(IApplicationBuilder应用程序)
{
var simpleSubscriber=await simpleSubscriber.CreateAsync(subscriptionName);
var receivedMessages=新列表();
simpleSubscriber.StartAsync((msg,cancellationToken)=>
{
//在这里处理消息。
返回Task.FromResult(SimpleSubscriber.Reply.Ack);
});
...
}
方法2:使用专门创建的库定期运行作业,例如Quartz、Hangfire或FluentScheduler,每次触发作业时,使用
SubscriberClient
提取新消息


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

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

但是,请参见
StartAsync
的文档:

开始接收消息。返回的
任务
在以下任一情况下完成 调用
StopAsync(CancellationToken)
,或者如果无法恢复 出现故障。此方法每次调用次数不能超过一次
SubscriberClient
实例

因此,您确实需要处理意外的
StartAsync
shutdown(不可恢复的错误)。最简单的方法是使用外部循环,尽管这些错误被认为是不可恢复的,但在调用成功之前,可能需要更改调用的某些内容

代码可能如下所示:

while (true)
{
    // Each SubscriberClientinstance must only be used once.
    var subscriberClient = await SubscriberClient.CreateAsync(subscriptionName);
    try
    {
        await subscriberClient.StartAsync((msg, cancellationToken) =>
        {
            // Process the message here.
            return Task.FromResult(SimpleSubscriber.Reply.Ack);
        });
    }
    catch (Exception e)
    {
        // Handle the unrecoverable error somehow...
    }
}
如果这不符合预期,请


编辑
SimpleSubscriber
在库中重命名为
SubscriberClient
,因此答案已相应编辑。

@Flater这是一个运行在Kubernetes中的ASP.NET核心应用程序。我希望应用程序同时具有一些REST端点,并继续收听一些发布/订阅消息。(我知道我可以把这两件事分成两个部分,但如果可能的话,为了方便起见,我想把它作为一个部分。)我会从最简单的方法开始,然后如果需要的话,搬到图书馆。在您的示例中,我只添加代码,用于将
simpleSubscriber
保存在静态字段中的某个位置,以保护对象不受GCA的影响。据我所知,第一种方法应该可以-但我正在与了解更多信息的同事联系。感谢您提供的信息!所谓不可恢复的错误,您指的是堆栈溢出或内存不足之类的情况,所以它不会因为短暂的网络故障或类似的情况而停止,对吗?顺便问一下,监听是如何实现的,
SimpleSubscriber
是内部轮询还是Pub/Sub支持类似WebSocket的连接?@MarkVincze SimpleSubscriber源代码在这里:您可以自己查看;)它使用一个长时间运行的流式RPC调用,该调用在第613行启动。@MarkVincze“unrecoverable”表示一个不可恢复的RPC错误。可恢复的RPC错误列表如下:所有其他错误都不可恢复。请注意,SimpleSubscriber已重命名为SubscriberClient。新的GitHub链接: