1

我正在使用此处的教程从 Azure 服务总线推送数据和使用数据。当我第二次运行该示例时,我得到一个错误 PUT https://asbtest.servicebus.windows.net/TestQueue?api-version=2012-08返回了 409 Conflict 的响应状态,这就是说你已经有一个具有该名称的配置,因此不要再次创建它。很可能,这是有罪的代码

Configuration config = 
ServiceBusConfiguration.configureWithWrapAuthentication(
  "HowToSample",
  "your_service_bus_owner",
  "your_service_bus_key",
  ".servicebus.windows.net",
  "-sb.accesscontrol.windows.net/WRAPv0.9");

ServiceBusContract service = ServiceBusService.create(config);
QueueInfo queueInfo = new QueueInfo("TestQueue");

那就是回忆 create() 是造成问题的原因,我猜。但是来自http://dl.windowsazure.com/javadoc/的com.microsoft.windowsazure.services.serviceBus.ServiceBusService 中的所有方法都只是创建,我无法找到类似的方法

ServiceBusContract service = A_class_that_finds_existing_bus_contract.find(config);

是我想错了方向,还是有其他出路。任何指针表示赞赏。

编辑:

我意识到我所要求的代码示例是配置,而不是服务总线合同。更新它,以反映。

4

2 回答 2

1

原来我错了。正如我从 Javadocs 中收集的那样,ServiceBusService 中的 create() 函数不会引发任何异常。此外,您可以多次创建服务总线合同,因为它只是一个连接。当您尝试使用已存在的名称创建队列时,会出现异常。就是这条线。

String path = "TestQueue";
QueueInfo queueInfo = new QueueInfo(path);

为了克服这一点,你可以走这条路。

import com.microsoft.windowsazure.services.serviceBus.Util;
...
...
Iterable<QueueInfo> iqnf = Util.iterateQueues(service);
boolean queue_created = false;
for( QueueInfo qi : iqnf )
{
  if( path.toLowerCase().equals( qi.getPath() )) 
  {
    System.out.println(" Queue already exists. Do not create one.");
    queue_created = true;
  }
}
if ( !queue_created ) {
  service.createQueue(queueInfo);
}

希望这有助于任何可能被困在 Azure 上为队列创建冲突的人。

编辑:即使我得到了路径代码,我的代码也拒绝工作。事实证明还有另一个警告。Azure 将所有队列名称设为小写。我已经编辑了代码以使用 toLower() 来解决这个问题。

于 2013-10-31T20:07:05.037 回答
0

我赞成 Soham 的问答。尽管我没有验证它,但我不知道小写字母。它确实也证实了我现在遇到的问题。

@Soham 解决这个问题的方式很好,但对于我们可能有大量队列的大型 ServicebU 来说并不好,它增加了迭代它的开销。唯一的方法是捕获非常通用的 ServiceException 并忽略该异常。

例子:

QueueInfo queueInfo = new QueueInfo(queName);
        try {
            CreateQueueResult qr = service.createQueue(queueInfo);
        } catch (ServiceException e) {
          //Silently ignore for now. 
        }

正确的方法是让 Azure 库扩展 ServiceException,throw "ConcflictException"例如,它存在于httpStatusCodeofServiceException但不幸的是它设置为 Private。

因为它不是我们必须扩展 ServiceException 并覆盖 httpStatusCode 设置器。

同样,这不是最好的方法,但如果我们将其列为对 Github 问题的反馈,图书馆可以改进。

注意:ServiceBus 仍处于预览阶段。

于 2016-11-11T05:34:53.580 回答