0

我正在使用服务总线在 Web 角色和工作角色之间进行通信,但它给了我一些不稳定的结果。我已将我的云项目部署到 azure。令人惊讶的是,当我只运行已部署的项目时,服务总线工作正常,但是当我也在使用服务总线的本地仿真器上运行相同的项目时,服务总线出现故障,因为所有消息都出现死信或不被工作者角色接收。这是服务总线的正常行为吗?如果不是,可能是什么问题,我该如何解决?

这对我来说很烦人,因为现在当我在本地模拟器上运行我的项目时,服务总线永远无法正常工作。

这就是发送和接收消息的方式,但我想问题可能不在其中,因为当服务总线仅由部署的项目使用时它工作正常。

工人角色:

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

网络角色:

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

您能否详细说明以下内容?

1) 您是否使用相同的服务总线连接字符串进行调试和部署的服务?请注意,服务总线队列/主题不会在模拟器中运行,即使您的云服务正在那里调试,所以您总是在 Azure 中访问实时服务。

2) 检查Queue/Topic/Messages 上的MaxDeliveryCountTimeToLive属性。当消息上的DeliveryCount超过 MaxDeliveryCount 时,消息会出现死信,每次收到且不完成消息时都会递增(调试时您可能希望设置更高的值)

于 2013-04-01T16:20:45.340 回答
0

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

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

于 2013-04-25T17:10:28.413 回答