private void PullOnce(Action<long> callback, CancellationToken cancellationToken)
{
_logger.LogVerbose($"Pulling messages from {_subscriptionName}...");
// Pull some messages from the subscription.
var response = _sub.Pull(_subscriptionName, false, 3,
CallSettings.FromCallTiming(
CallTiming.FromExpiration(
Expiration.FromTimeout(
TimeSpan.FromSeconds(90)))));
if (response.ReceivedMessages == null)
{
// HTTP Request expired because the queue was empty. Ok.
_logger.LogVerbose("Pulled no messages.");
return;
}
_logger.LogVerbose($"Pulled {response.ReceivedMessages.Count} messages.");
foreach (var message in response.ReceivedMessages)
{
try
{
// Unpack the message.
byte[] json = message.Message.Data.ToByteArray();
var qmessage = JsonConvert.DeserializeObject<QueueMessage>(
Encoding.UTF8.GetString(json));
// Invoke ProcessBook().
callback(qmessage.BookId);
}
catch (Exception e)
{
_logger.LogError("Error processing book.", e);
}
}
// Acknowledge the message so we don't see it again.
var ackIds = new string[response.ReceivedMessages.Count];
for (int i = 0; i < response.ReceivedMessages.Count; ++i)
ackIds[i] = response.ReceivedMessages[i].AckId;
_sub.Acknowledge(_subscriptionName, ackIds);
}
// [END pullonce]