[2014年12月12日增加备注:12月10日,Microsoft Azure Java SDK team发布了v0.7.0版本,增加对Service Bus SAS的支持,已解决这个问题:-)]

  最近在研究Microsoft Azure,在分布式消息传递上,Amazon的AWS有SQS,而在Microsoft Azure上与之对应的是Service Bus Queue

  Service Bus队列(Queue)的作用是,在分布式应用程序的组件通信时,组件间不会直接相互通信,而是通过充当中介的队列交换消息。这样可以更好地向外扩展应用程序,并增强体系结构的恢复能力,因为消息会被可靠的保存在队列中,不会因一方崩溃而丢失消息。

  值得注意的是,Azure还有另外一种Queue,属于存储Storage部分,叫做Azure Queue,经过对比,由于Service Bus除Queue外还包括主题Topic\订阅Subscription功能,因此更能引起我的兴趣,满足需求,具体他们之间的区别可看微软文档:http://msdn.microsoft.com/library/azure/hh767287,非常详细。

  微软针对Azure提供了各种开源的SDK,包括.NET,Java,Nodejs以及其他。

  但是最近在写Service Bus Queue示例程序时,使用Java SDK遇到问题,Java SDK无法完成认证,也就无法操作Azure上的命名空间(Namespace)以及队列(队列属于命名空间,需要连接命名空间,完成认证,才能操作其中队列,主题等)。

一. 问题产生的原因

   微软前阵子改变了Service Bus命名空间的认证方式,之前是ACS,后来改成了SAS(共享访问认证),官方的解释是SAS提供了更好的性能(SAS只需提供连接字符串信息完成认证)以及其他优点,具体可参考微软文档http://blogs.msdn.com/b/cie/archive/2014/08/29/service-bus-namespace-creation-on-portal-no-longer-has-acs-connection-string.aspx。

   但是问题出现在,Azure Java SDK仍在使用ACS的认证方式,上一个版本的Release在2014年8月4日,当时可能微软Azure Portal还未改变认证方式。这就导致了问题的出现,使用Java SDK无法完成认证。

二. 解决方案

   经过在网上查找信息,在Github上查找相关问题,以及在MSDN上提问,目前的解决方案有以下4种,如果你仍想用Java编程的话。

   1. 等待微软官方的下一个Java SDK Release版本,最新的版本是2014年8月4日,v0.6.0。以下截图是微软Support的回复:

     

     具体下一版本Release的时间,我会在MSDN上提问以及私信上面这哥们。

   2. 自己重写Java SDK,因为它是开源的,本质是对Restful API的封装,但不清楚工作量,我没试过。

   3. 直接使用Restful API。

   4. Walkround方案,一种网上提出的可行方案:使用Powershell去创建Service Bus命名空间,仍会默认使用ACS。但是我今天试验了很多次,命令全部运行失败。不确定这种方法是否可行。参考文档:http://blogs.msdn.com/b/cie/archive/2014/08/29/service-bus-namespace-creation-on-portal-no-longer-has-acs-connection-string.aspx

三. 参考文档

   1. Azure Java SDK Github

     https://github.com/Azure/azure-sdk-for-java

   2. Service Bus namespace creation on portal no longer has ACS connection string

     http://blogs.msdn.com/b/cie/archive/2014/08/29/service-bus-namespace-creation-on-portal-no-longer-has-acs-connection-string.aspx

   3. 我在MSDN提出的问题及答复

     https://social.msdn.microsoft.com/Forums/azure/en-US/dbfdb53c-37f9-4884-8d60-4b77ad418b3a/servicebusconfigurationconfigurewithconnectionstring-cant-work-error-the-key?forum=servbus

四. 代码

 //get connection string from config file
String connectionString = ConfigHandler.getConnectionString();
System.out.println("Connection String: " + connectionString); //get config
config = new Configuration();
ServiceBusConfiguration.configureWithConnectionString(null, config, connectionString); //create service
service = ServiceBusService.create(config);

    运行结果:

 Exception in thread "main" java.lang.RuntimeException: The key 'SharedAccessKeyName' is not valid for this connection string

  由于使用Azure Java SDK代码简单,这里就不贴全代码。具体使用方法可参照微软文档。

最后吐槽下,微软Azure Java SDK从2011年至今共推出19个Release版本,但是相比之下,.NET SDK推出了111个Release。What a sad story......

抛砖引玉。谢谢。欢迎一起讨论。

Best Regards      

Kevin Song

 

【Microsoft Azure学习之旅】Azure Java SDK - Service Bus的认证问题的更多相关文章

  1. 【Microsoft Azure学习之旅】消息服务Service Bus的学习笔记及Demo示例

    今年项目组做的是Cloud产品,有幸接触到了云计算的知识,也了解并使用了当今流行的云计算平台Amazon AWS与Microsoft Azure.我们的产品最初只部署在AWS平台上,现在产品决定同时支 ...

  2. 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息

    组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...

  3. 我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换

    今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static vo ...

  4. dotnet Core学习之旅(一):安装SDK

    [重要:文中所有外链不能确保永久有效] >环境 .NET Core 包含两个部分 .NET Core Runtime 和 .NET Core SDK(包含Runtime) 点击此处到达下载页面( ...

  5. 我的Java开发学习之旅------>Java经典排序算法之归并排序

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...

  6. 矿Java开发学习之旅------>Java排序算法经典的二分法插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比較 ...

  7. Windows Azure Service Bus (2) 队列(Queue)入门

    <Windows Azure Platform 系列文章目录> Service Bus 队列(Queue) Service Bus的Queue非常适合分布式应用.当使用Service Bu ...

  8. Azure Service Bus(三)在 .NET Core Web 应用程序发送ServiceBus Queue

    一,引言 在之前上一篇讲解到 Azure ServiceBus Queue 中,我们实地的演示了在控制台中如何操作ServiceBus Queue ,使用 Azure.Messgae.Service ...

  9. 乘风破浪,Java遇见OpenJDK GA(Build By Microsoft),即将晋升为Azure云管理服务默认JVM

    什么是Microsoft Build of OpenJDK Java Development Kit (JDK) 是Sun公司(已被Oracle收购)针对Java开发员的软件开发工具包.自从Java推 ...

随机推荐

  1. CF1101E Polycarp's New Job

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #i ...

  2. github 第三方登录

    第三方登录先了解 OAuth 2.0 OAuth 协议的认证和授权的过程如下: 用户打开我的博客后,我想要通过GitHub获取改用户的基本信息 在转跳到GitHub的授权页面后,用户同意我获取他的基本 ...

  3. C#中web项目使用log4net日志

    我准备把log4net的实现方法放在一个类库项目中,别的项目直接引用该类库,即可进行日志的记录,操作步骤如下: 1.下载log4net.dll文件 2.在解决方案下创建类库项目 3.把log4net. ...

  4. C:foreEach

    c:forEach用法   <c:foreach>用法   <c:foreach>类似于for和foreach循环   以下是我目前见过的用法:1.循环遍历,输出所有的元素.& ...

  5. RequestContextHolder与RequestContextUtils

    org.springframework.web.servlet.support.RequestContextUtils 在spring-webmvc中, 主要用来获取WebApplicationCon ...

  6. my.宝石 --- --- ZC 收集

    1.         DT PT 头盔 太阳石 物理伤害+8     √     月亮石 物理防御+12     √ 武器 太阳石 物理伤害+8   √     舍利子 法术伤害+6         ...

  7. 记录CentOS7.X版本下安装MySQL5.7数据库

    记录CentOS7.X版本下安装MySQL5.7数据库  设置rpm下载目录在/opt目录下新建一个目录存放mysql cd /opt sudo mkdir mysql12  下载MySQL的源 wg ...

  8. call and apply

    apply()把参数打包成Array再传入: call()把参数按顺序传入. Math.max.apply(null, [3, 5, 4]); // 5 Math.max.call(null, 3, ...

  9. Python函数调用

    1.同级目录下的调用 - src |- mod1.py |- test1.py 若在程序test1.py中导入模块mod1.py,则直接使用 import mod1 或 from mod1 impor ...

  10. BaseAdapter,SimpleAdapter,CursorAdapter的用法

    简单好用的Adapter---ArrayAdapter ArrayAdapter是BaseAdapter的派生类,在BaseAdapter的基础上,添加了一项重大的功能:可以直接使用泛型构造. 我们先 ...