【问题标题】:How to change the properties of a service bus queue?如何更改服务总线队列的属性?
【发布时间】:2013-04-15 14:10:11
【问题描述】:

我正在使用服务总线队列在 Web 角色和辅助角色之间进行通信。有时,工作角色不接受 Web 角色消息。但它会立即接受我发送的下一条消息。所以我想这可能是因为启用了批处理操作。我一直试图把它假,但我还没有成功。这是我的代码。

public static QueueClient GetServiceBusQueueClient(string queuename)
    {            
        string connectionString;

        if (RoleEnvironment.IsAvailable)
         connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
        else
            connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];          


        var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

        QueueDescription queue = null;

        if (!namespaceManager.QueueExists(queuename))
        {
            queue = namespaceManager.CreateQueue(queuename);
            queue.EnableBatchedOperations = false;
            queue.MaxDeliveryCount = 1000;
        }
        else
        {
            queue = namespaceManager.GetQueue(queuename);
            queue.EnableBatchedOperations = false;
            queue.MaxDeliveryCount = 1000;
        }

        MessagingFactorySettings mfs = new MessagingFactorySettings();
        mfs.NetMessagingTransportSettings.BatchFlushInterval = TimeSpan.Zero;

        string issuer;
        string accessKey;
         if (RoleEnvironment.IsAvailable)
            issuer = RoleEnvironment.GetConfigurationSettingValue("AZURE_SERVICEBUS_ISSUER");
         else
             issuer = ConfigurationManager.AppSettings["AZURE_SERVICEBUS_ISSUER"];

        if (RoleEnvironment.IsAvailable)
            accessKey = RoleEnvironment.GetConfigurationSettingValue("AZURE_SERVICEBUS_ACCESS_KEY");
        else
            accessKey = ConfigurationManager.AppSettings["AZURE_SERVICEBUS_ACCESS_KEY"];

        mfs.TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(issuer, accessKey);
        MessagingFactory messagingFactory = MessagingFactory.Create(namespaceManager.Address, mfs);

        QueueClient Client = messagingFactory.CreateQueueClient(queue.Path);            

        return Client;
    }

但 EnableBatchedOperations 始终为 true,MaxDeliveryCount 默认始终为 10。

如果您知道问题出在哪里,请告诉我

谢谢

【问题讨论】:

    标签: c# asp.net-mvc azure azure-storage azureservicebus


    【解决方案1】:

    如果您想设置EnabledBatchedOperations,您必须在创建队列之前进行。您可以通过创建 QueueDescription 对象然后将其传递给 CreateQueue 方法来做到这一点。例如:

    QueueDescription orderQueueDescription =
        new QueueDescription(queuename)
        {
            RequiresDuplicateDetection = true,
            MaxDeliveryCount = 1000,
        };
    namespaceMgr.CreateQueue(orderQueueDescription);
    

    更新:

    文档对此非常清楚:

    由于一旦创建消息传递实体就无法更改元数据,因此修改重复检测行为需要删除并重新创建队列。相同的原则适用于任何其他元数据。 [1]

    QueueDescription 表示队列的元数据描述。

    [1]http://msdn.microsoft.com/en-us/library/windowsazure/hh532012.aspx

    【讨论】:

    • 值得补充的是,NamespaceManager 上的 UpdateQueue 操作不允许您更新此属性 - 您可以在创建队列之前设置它。
    • 谢谢!我只需要另外一件事的帮助。你能确认我将批量刷新间隔设置为零的方式是正确的吗?因为没有办法查看它是否已设置为零。再次感谢
    • @Bitsian 我不确定您所说的“正确”是什么意思。是的,您可以将值设置为零而不会出错。这样做是禁用批处理。如果这就是你想要的,那么你就做对了。
    • 是的,我想禁用批处理。但是我在创建队列后设置了 Batch Flush Interval,这就是为什么我问我为它编写的代码是否可以工作。
    • 知道批处理的作用吗?我猜队列客户端将等待收集一些消息以批量发送它们?就我而言,第一次发送消息时没有收到消息。如果我再次发送一条消息,那么这次会收到上一条消息。
    【解决方案2】:

    更新 Azure SDK 2.3

    NamespaceManager 上的 UpdateQueue 方法仍然不允许您更新任何属性,除了暂停或恢复队列。

    如果您需要更改现有队列的 MaxDeliveryCount 并且不想删除并重新创建队列,则唯一的选择是在 Azure 门户中进行更改。

    【讨论】:

    • 如何在 Azure 门户中更改它?我的门户中没有该选项...
    • 查看本教程的截图simple-talk.com/cloud/cloud-data/…
    • 我阅读了您推荐的页面。只是为了尝试一下,我创建了一个新队列。如您所说,有一个编辑页面。但就我而言,我有一个带有订阅队列的主题。由于某种原因,门户不允许您编辑订阅队列的属性......为什么会有锁定限制???
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2019-02-12
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多