【问题标题】:How does the service bus QueueClient.Receive work?服务总线 QueueClient.Receive 是如何工作的?
【发布时间】:2013-01-27 16:25:41
【问题描述】:

我正在使用服务总线队列在 Web 角色和辅助角色之间进行通信。我的服务总线上有两个队列。我正在将来自 Web 角色的消息放入队列,并且辅助角色处理该消息并将另一条消息放回另一个队列,Web 角色检索并发送给客户端。 Web 角色和辅助角色线程都在持续运行

我想知道执行控制何时在 QueueClient.Receive,它是等到它收到消息还是队列中没有消息然后移动到下一行?因为在队列上没有消息的情况下,我在 QueueClient.Receive 放置了一个断点来检查接下来会发生什么,但是控件没有转到下一行它只是消失了,所以我认为它可能只是在等待。

但在下面的 Web 角色中,我通过服务总线队列向工作角色发送消息,并期待工作角色立即再次响应,但有时工作角色需要一些处理时间,而 Web 角色没有得到它并且网络角色线程进入睡眠状态。

我是 Windows azure 的初学者,所以对整个问题有点困惑。谁能帮帮我?

我的工人角色:

// Receive the message from Web Role
BrokeredMessage receivedBroadcastMessage = null;
receivedBroadcastMessage = WebRoleClient.Receive();

if (receivedBroadcastMessage != null)
{
    // Process the message

    receivedBroadcastMessage.Complete();
}

BrokeredMessage webRoleMessage = new BrokeredMessage(processedMessage);
WorkerRoleClient.Send(webRoleMessage);

我的网络角色:

// send the request to worker role
BrokeredMessage webRoleMessage = new BrokeredMessage(details);
WebRoleClient.Send(webRoleMessage);

// receive the queue from worker role
BrokeredMessage workerRoleMessage = null;
workerRoleMessage = WorkerRoleClient.Receive();

if (workerRoleMessage != null)
{ 
    //process message

    workerRoleMessage.Complete();
}
else
{
    // sleep thread
}   

【问题讨论】:

    标签: c# azure azure-web-roles azure-worker-roles servicebus


    【解决方案1】:

    使用默认方法,对 QueueClient.Receive 的调用将立即返回。如果在特定时间队列中没有消息,您将获得 NULL 值,如果有消息,您将获得 BrokeredMessage 的实例。

    QueueClient.Receive 有几个覆盖,您可以在其中指定超时。在这种情况下,如果没有任何消息,该方法将等到超时到期从调用中返回。这有助于避免在收到消息之前必须重新连接多次。

    对于你提到的情况,你应该尝试使用QueueClient.Receive(timespan)版本的API,这样线程会等待更长的时间来接收消息。另一种选择是将您的消息接收逻辑放在一个循环中,并中断直到您收到一条消息。

    【讨论】:

    • 其实默认的 QueueClient.Receive() 是等待几秒钟来接收消息。我的意思是已经有一个默认的超时设置。无论如何,我找到了异步接收消息的整个过程的方法。参考这个问题stackoverflow.com/questions/14852670/…
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2013-05-27
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多