4

Webロールとワーカーロールを接続するためにサービスバスを使用しています。私のワーカーロールは継続的なループにあり、QueueClient.Receive()メソッドを使用してWebロールによって送信されたメッセージを受信して​​います。

ただし、この方法では、サービスバスキューにメッセージがない場合、次の行に移動してさらに実行するのではなく、メッセージを受信するまで数秒待機します。私はメッセージを受信するための非同期の方法があることを望んでいましたか?または、この待機時間を設定するための少なくともいくつかの方法はありますか?

QueueClientのmsdnドキュメントからこのBeginReceiveメソッドを見つけました 。これ が私の質問に対する答えになることを期待していましたが、このメソッドの使用方法がわかりません。メソッドパラメータは非同期コールバックとオブジェクトの状態ですが、それらが何であるかはわかりません。

何か案は?

更新: Sandrinoによる優れたソリューションのおかげで、非同期で動作します。しかし、非同期であることは今私にいくつかの問題を与えています。VSがクラッシュしています。問題が何であるかわからない。以下は、使用しているコードです。

労働者の役割:

public override void Run()
    {
while (!IsStopped)
        {                
                // Receive the message from Web Role to upload the broadcast to queue
                BroadcastClient.BeginReceive(OnWebRoleMessageReceived, null);                    

                // Receive the message from SignalR BroadcastHub
                SignalRClient.BeginReceive(OnSignalRMessageReceived, null);                    

            }
}


public void OnWebRoleMessageReceived(IAsyncResult iar)
    {
        BrokeredMessage receivedBroadcastMessage = null;
        receivedBroadcastMessage = BroadcastClient.EndReceive(iar);

        if (receivedBroadcastMessage != null)
        {   //process message
           receivedBroadcastMessage.Complete();
        }
    }

public void OnSignalRMessageReceived(IAsyncResult iar)
    {
        BrokeredMessage receivedSignalRMessage = null;
        receivedSignalRMessage = SignalRClient.EndReceive(iar);

        if (receivedSignalRMessage != null)
        {
            //process message
           receivedSignalRMessage.Complete();

           WorkerRoleClient.Send(signalRMessage);
        }
     }

VSを動作させてクラッシュさせるものを見逃していますか?BeginReceiveに移行する前は、iwがQueueClient.Receiveを使用していると、正常に動作し、クラッシュしなかったためです。

ありがとう

4

3 に答える 3

6

BeginReceive方法はあなたの場合に行く方法です。通常、次のように呼びます。

void SomeMethod() 
{
     ...
     client.BeginReceive(TimeSpan.FromMinutes(5), OnMessageReceived, null);
     ...
}

void OnMessageReceived(IAsyncResult iar)
{
     var msg = client.EndReceive(iar);
     if (msg != null)
     {
         var body = msg.GetBody<MyMessageType>();
         ...
     }
}
于 2013-02-13T12:05:48.170 に答える
1

これは私がそれをした方法です(Sandrino De Mattiaのソリューションを拡張します):

void SomeMethod() 
{
    ...
    client.BeginReceive(TimeSpan.FromSeconds(5), OnMessageReceived, null);
    ...
}

void OnMessageReceived(IAsyncResult iar)
{
    if(!IsStopped)
    {
        var msg = client.EndReceive(iar);
        if (msg != null)
        {
            var body = msg.GetBody<MyMessageType>();

            ... //Do something interesting with the message

            //Remove the message from the queue
            msg.Complete();

            client.BeginReceive(TimeSpan.FromSeconds(5), OnMessageReceived, null);
        }
    }
}

そうすれば、停止メカニズムを備えた「無限ループ」ができます。

于 2014-11-03T15:07:21.153 に答える
1

Azure ServiceBus SDKの最新バージョン(ダウンロードリンク)は、メッセージを非同期で受信するための完全なサポートを提供します。

async Task TestMethod()
{
    string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

    QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "TestQueue");
    var message = await Client.ReceiveAsync();
}
于 2015-12-17T10:31:04.667 に答える