2013-03-31 14 views
0

我正在使用服务总线在网络角色和工作者角色之间进行通信,但它一直给我带来一些不稳定的结果。我已经将我的云计划部署到了天蓝。如此令人惊讶的是,当我只运行已部署的项目时,服务总线工作正常,但是当我也在使用服务总线的本地模拟器上运行相同的项目时,服务总线变得有问题,因为在所有消息中,或者不被工作者角色接收。这是服务巴士的正常行为吗?如果不是,可能是什么问题,我该如何解决它?为什么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; 
} 
+0

您可能想要以线程安全的方式读取/写入跨线程共享的变量。 (例如Volatile.Read和Volatile.Write)。您可能由于缓存或由于运行时编译器优化而缺少值。 –

+0

您可以在我的上下文中使用一些代码片段来详细说明吗?或任何链接? – Bitsian

回答

0

问题出现是因为在我们的工作角色我们不断检查服务总线队列以查看消息是否已到达。当我们启动本地和云工作者角色时,这两个角色都尝试从同一个服务总线队列接收新消息。因此,有时云接受它,有时是本地的。

对云和本地项目使用不同的服务总线队列名称解决了问题。

0

能否请您阐述一下以下?

1)您是否使用相同的Service Bus连接字符串进行调试和部署的服务?请注意,即使在您的云服务正在进行调试时,服务总线队列/主题也不会在模拟器中运行,因此您始终使用Azure中的实时服务。

2)检查队列/主题/消息中的MaxDeliveryCountTimeToLive属性。当消息超过MaxDeliveryCount时,消息是无效的,这会在您每次收到并且没有完成消息时增加(您可能希望在调试时设置更高的值)

+0

是的,我为调试和部署服务使用相同的连接字符串。 MaxDeliveryCount默认设置为10,TimeToLive也具有更高的值。奇怪的问题是,当我不在本地调试云项目使用服务总线完美运行。但是,当我开始调试时,服务总线不起作用。 – Bitsian

相关问题