我想实现一个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}拉新消息}。
哪一个是首选方法?第一个似乎更简单,但我不确定它是否真的可靠。
答案 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。