当具有服务总线队列的工作者角色完成其处理时,您如何通知?
How do you notify when a worker role with service bus queue completes it's processing?
我正在尝试使用带有服务总线队列的 Azure WorkerRoles 创建一个微服务并让它工作,但我不确定从这里去哪里。
目前,我能够连接到 WorkerRole 并发送带有我想要 OCR 的图像的 URI 的 Brokered 消息,我能够 运行 图像上的 OCR,但是我如何return 返回给客户端 OCR 已完成并提取文本,因为它是异步的?
这是我对 Client.OnMessage
的实现
Client.OnMessage((receivedMessage) =>
{
try
{
MyServiceBusMessage messageBody = receivedMessage.GetBody<MyServiceBusMessage>();
// Process the message
Trace.WriteLine("Processing Service Bus message: " + receivedMessage.SequenceNumber.ToString());
Trace.WriteLine("Service Bus message ID: " + messageBody.ID);
Trace.WriteLine("Service Bus message Type: " + messageBody.Type);
Trace.WriteLine("Service Bus message Image Name: " + messageBody.ImageUri);
Uri imageURi = messageBody.ImageUri;
Guid imageGuid = messageBody.ID;
receivedMessage.Complete();
string text = DoOCR(imageGuid, imageURi);
}
catch(Exception ex)
{
receivedMessage.DeadLetter("Exception Occured", ex.Message);
// Handle any message processing specific exceptions here
}
});
但现在我不确定从这里去哪里,我在网上找不到任何有用的东西,所以我想知道是否有人对下一步去哪里有任何想法或提示。
目前我正在使用控制台应用程序将消息发送到队列,如下所示:
QueueClient client = QueueClient.CreateFromConnectionString(constr, queueName);
using (var bMessage = new BrokeredMessage(message))
{
client.Send(bMessage);
}
我能否向客户端发回一条消息,让它知道 OCR 已完成提取的文本?如果是这样,我将如何实现?
您描述的场景听起来像是典型的 Request/Reply 模式。
您可以让您的控制台应用程序监听另一个队列,并且辅助角色在完成后发送一条消息,包括状态和原始图像 ID。
您还可以查看可以更轻松地实现所需内容的框架。看看 NServiceBus or MassTransit. Both support different transports and Azure Service Bus 就是其中之一。
旁注:我注意到您在 OCR 工作之前完成了消息。您可能想要更改它并在 OCR 调用完成后完成消息。目前,如果 DoOCR()
抛出异常,您的消息将永远不会重试,因为它会被标记为已完成。
我正在尝试使用带有服务总线队列的 Azure WorkerRoles 创建一个微服务并让它工作,但我不确定从这里去哪里。
目前,我能够连接到 WorkerRole 并发送带有我想要 OCR 的图像的 URI 的 Brokered 消息,我能够 运行 图像上的 OCR,但是我如何return 返回给客户端 OCR 已完成并提取文本,因为它是异步的?
这是我对 Client.OnMessage
的实现Client.OnMessage((receivedMessage) =>
{
try
{
MyServiceBusMessage messageBody = receivedMessage.GetBody<MyServiceBusMessage>();
// Process the message
Trace.WriteLine("Processing Service Bus message: " + receivedMessage.SequenceNumber.ToString());
Trace.WriteLine("Service Bus message ID: " + messageBody.ID);
Trace.WriteLine("Service Bus message Type: " + messageBody.Type);
Trace.WriteLine("Service Bus message Image Name: " + messageBody.ImageUri);
Uri imageURi = messageBody.ImageUri;
Guid imageGuid = messageBody.ID;
receivedMessage.Complete();
string text = DoOCR(imageGuid, imageURi);
}
catch(Exception ex)
{
receivedMessage.DeadLetter("Exception Occured", ex.Message);
// Handle any message processing specific exceptions here
}
});
但现在我不确定从这里去哪里,我在网上找不到任何有用的东西,所以我想知道是否有人对下一步去哪里有任何想法或提示。
目前我正在使用控制台应用程序将消息发送到队列,如下所示:
QueueClient client = QueueClient.CreateFromConnectionString(constr, queueName);
using (var bMessage = new BrokeredMessage(message))
{
client.Send(bMessage);
}
我能否向客户端发回一条消息,让它知道 OCR 已完成提取的文本?如果是这样,我将如何实现?
您描述的场景听起来像是典型的 Request/Reply 模式。 您可以让您的控制台应用程序监听另一个队列,并且辅助角色在完成后发送一条消息,包括状态和原始图像 ID。
您还可以查看可以更轻松地实现所需内容的框架。看看 NServiceBus or MassTransit. Both support different transports and Azure Service Bus 就是其中之一。
旁注:我注意到您在 OCR 工作之前完成了消息。您可能想要更改它并在 OCR 调用完成后完成消息。目前,如果 DoOCR()
抛出异常,您的消息将永远不会重试,因为它会被标记为已完成。