4

Web ロールからワーカー ロールにメッセージを送信しています。以前は、これらのメッセージは適切かつ即座に受信されていましたが、すべてのメッセージの内容が同じであっても、突然一部のメッセージが受信されなくなりました。たとえば、あるメッセージを今送信すると、受信されませんが、その直後に別のメッセージを送信すると、最新のメッセージが受信されます。以前に受信されなかったものは、数秒後に突然受信されるか、有効期限が切れたときにデッド レター メッセージになることがあります。

問題が何であるかを理解できません。何かアイデアはありますか? または、この動作はサービスバスでは正常ですか?

これは、ワーカーロールでメッセージを受信する方法です

編集:

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

                if (SignalRMessageReceived)
                {
                    SignalRMessageReceived = false;
                    // Receive the message from SignalR BroadcastHub
                    SignalRClient.BeginReceive(OnSignalRMessageReceived, null);
                }

                if (SignalRFirstTimeMessageReceived)
                {
                    SignalRFirstTimeMessageReceived = false;
                    // Receive the message from SignalR BroadcastHub
                    SignalRFirstTimeClient.BeginReceive(OnSignalRFirstTimeMessageReceived, null);
                }          
         }
     }


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

        if (receivedBroadcastMessage != null)
        {
            // Process the message
           receivedBroadcastMessage.Complete();
        }
BroadcastReceived = true;
     }

アップデート :

BroadcastClient = CloudStorageHelper.GetServiceBusQueueClient(Queuenames.ApiToWorkerRole);

public static QueueClient GetServiceBusQueueClient(string queuename)
    {
        string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

        var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

        if (!namespaceManager.QueueExists(queuename))
        {
            namespaceManager.CreateQueue(queuename);
        }

        QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, queuename);



        return Client;
    }

Web ロール:

var queueClient = CloudStorageHelper.GetServiceBusQueueClient(Queuenames.ApiToWorkerRole);

            //for testing purposes
            record.Username = "owner";
            record.Channel = "World";
            record.Title = "Sample";
            record.Duration = 10;

            BrokeredMessage message = new BrokeredMessage(record);

            queueClient.Send(message);
4

2 に答える 2

0

上記の worker ロールでは、[Run only once] でコードを実行しています。本質的にこれは、worker ロールが実行されるたびに 1 つのメッセージが処理されることを示していますか? ループ内でメッセージを処理する典型的なコードは次のようになります。

  public override void Run()
    {
        while (!IsStopped)
        {
            try
            {
                // Receive the message
                BrokeredMessage receivedMessage = null;
                receivedMessage = Client.Receive();

                if (receivedMessage != null)
                {
                    // Process the message
                    receivedMessage.Complete(); // Unless you do this the message goes back in the Queue
                }
            }
            catch (MessagingException e)
            {
                if (!e.IsTransient)
                {
                    Trace.WriteLine(e.Message);
                    throw;
                }

                Thread.Sleep(10000); // optional if you want to add a delay
            }
        }
    }
于 2013-02-22T17:11:04.307 に答える