0

サービス バスを使用して Web ロールとワーカー ロールの間の通信を行っていますが、不安定な結果が得られます。クラウド プロジェクトを Azure にデプロイしました。驚くべきことに、デプロイされたプロジェクトだけを実行すると、サービス バスは正常に動作しますが、サービス バスも使用しているローカル エミュレーターで同じプロジェクトを実行すると、すべてのメッセージのようにサービス バスが故障し、デッド レターに移動します。または worker ロールによって受信されません。これはサービス バスの正常な動作ですか? そうでない場合、何が問題であり、どうすれば修正できますか?

ローカル エミュレーターでプロジェクトを実行すると、サービス バスが正常に動作しないため、これは私にとってイライラします。

これがメッセージの送受信方法ですが、サービスバスをデプロイされたプロジェクトだけで使用している場合は問題なく動作するため、問題はないのではないでしょうか。

労働者の役割:

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;
 }

Web ロール:

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

        BrokeredMessage message = new BrokeredMessage(record);

        queueClient.Send(message);

サービス バス キューの作成方法:

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

2 に答える 2

0

この問題は、worker ロールで Service Bus キューを継続的にチェックして、メッセージが到着したかどうかを確認するために発生していました。そして、ローカル ワーカー ロールとクラウド ワーカー ロールの両方を開始すると、両方のワーカー ロールが同じ Service Bus キューから新しいメッセージを受信しようとします。したがって、クラウドが受け入れる場合もあれば、ローカルが受け入れる場合もあります。

クラウド プロジェクトとローカル プロジェクトに異なるサービス バス キュー名を使用することで、問題が解決しました。

于 2013-04-25T17:10:28.413 に答える