3

サービス バス キューを使用して、Web ロールとワーカー ロールの間で通信しています。サービス バスに 2 つのキューがあります。Web ロールからメッセージをキューに入れています。ワーカー ロールはそのメッセージを処理し、Web ロールが取得してクライアントに送信する別のキューに別のメッセージを戻します。Web ロール スレッドと worker ロール スレッドの両方が継続的に実行されている

実行制御が QueueClient.Receive にあるときを知りたいのですが、メッセージを受信するまで待機しますか、それともキューにメッセージがない場合は次の行に移動しますか? キューにメッセージがない状況では、次に何が起こるかを確認するために QueueClient.Receive にブレークポイントを設定しましたが、コントロールは次の行に移動せず、ただ消えるだけなので、待っているだけかもしれないと思ったからです。

しかし、以下の私の Web ロールでは、サービス バス キューを介してワーカー ロールにメッセージを送信しており、すぐにワーカー ロールからの応答を期待していますが、ワーカー ロールの処理に少し時間がかかり、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);

私の Web ロール:

// 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
}   
4

1 に答える 1

3

デフォルトのメソッドでは、QueueClient.Receiveの呼び出しはすぐに戻ります。その特定の時間にキューにメッセージがなかった場合はNULL値を取得し、メッセージがあった場合はBrokeredMessageのインスタンスを取得します。

QueueClient.Receiveには、タイムアウトを指定できるオーバーライドがいくつかあります。この場合、メッセージがない場合、メソッドはタイムアウトが期限切れになるまで待機して呼び出しから戻ります。これは、メッセージが表示されるまで何度も再接続する必要がないようにするために役立ちます。

あなたが言及した場合、APIのQueueClient.Receive(timespan)バージョンを試して使用する必要があります。そうすれば、スレッドはメッセージを受信するためにより長い時間待機します。もう1つのオプションは、メッセージ受信ロジックをループに入れ、メッセージを受信するまで中断することです。

于 2013-02-18T19:52:24.977 に答える