【Microsoft Azure学习之旅】Azure Java SDK - Service Bus的认证问题
[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的认证问题的更多相关文章
- 【Microsoft Azure学习之旅】消息服务Service Bus的学习笔记及Demo示例
今年项目组做的是Cloud产品,有幸接触到了云计算的知识,也了解并使用了当今流行的云计算平台Amazon AWS与Microsoft Azure.我们的产品最初只部署在AWS平台上,现在产品决定同时支 ...
- 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息
组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...
- 我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换
今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static vo ...
- dotnet Core学习之旅(一):安装SDK
[重要:文中所有外链不能确保永久有效] >环境 .NET Core 包含两个部分 .NET Core Runtime 和 .NET Core SDK(包含Runtime) 点击此处到达下载页面( ...
- 我的Java开发学习之旅------>Java经典排序算法之归并排序
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...
- 矿Java开发学习之旅------>Java排序算法经典的二分法插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比較 ...
- Windows Azure Service Bus (2) 队列(Queue)入门
<Windows Azure Platform 系列文章目录> Service Bus 队列(Queue) Service Bus的Queue非常适合分布式应用.当使用Service Bu ...
- Azure Service Bus(三)在 .NET Core Web 应用程序发送ServiceBus Queue
一,引言 在之前上一篇讲解到 Azure ServiceBus Queue 中,我们实地的演示了在控制台中如何操作ServiceBus Queue ,使用 Azure.Messgae.Service ...
- 乘风破浪,Java遇见OpenJDK GA(Build By Microsoft),即将晋升为Azure云管理服务默认JVM
什么是Microsoft Build of OpenJDK Java Development Kit (JDK) 是Sun公司(已被Oracle收购)针对Java开发员的软件开发工具包.自从Java推 ...
随机推荐
- servlet验证2
登录界面 登录成功后 数据库 地址:https://gitee.com/lgcj1218/j2eehomework/tree/master
- mybatis插入是返回主键id
<!-- 插入数据:返回记录的id值 --> <insert id="insertOneTest" parameterType="org.chench. ...
- POJ1008 Maya Calendar
题目来源:http://poj.org/problem?id=1008 题目大意: Maya人认为一年有365天,但他们有两种日历.一种叫做Haab,有19个月.前18个月每月20天,每个月的名字分别 ...
- php 多语言(UTF-8编码)导出Excel、CSV乱码解决办法之导出UTF-8编码的Excel、CSV
新项目,大概情况是这样的:可能存在多国.不同语种使用者,比喻有中文.繁体中文,韩文.日本等等,开发时选择了UTF-8编码,开发顺利,没有问题.昨天做了一个csv导出功能,导出的东西完全乱了: 设置mb ...
- SoapUI Properties的使用
Link:http://testautomationnoob.blogspot.com/2012/10/soapui-properties-and-property-related.html soap ...
- [JavaScript]Prototype继承
JavaScript相对于其他的编程语言是比较简单的,只要吃透了Prototype和Closure(闭包),基本上就可以说精通JavaScript了. JavaScript里如何实现向Java语言的O ...
- git学习--更新本地仓库单独文件
命令: git checkout origin/dev .gitignore 从远端 dev 仓库,更新本地签出分支的 .gitignore 文件
- poj2823滑动窗口(单调队列)
题目传送门 题意:给你一个长度为n的数列,然后用一个长度为k的窗口去框(k<n)每次保存k这个窗口中的最大值和最小值,输出. 思路:这道题最朴素的on2的做法铁定超时,然后我想过一个nlogn的 ...
- java——抽象类、接口、二者区别
抽象类: 抽象方法:不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰: abstract void method(); 抽象类:当一个类中包含了抽象方法时,该类必须使用abs ...
- VMware 无法连接虚拟设备ide1:0,主机上没有相对应的设备,您 要在每次开启此虚拟机时都尝试连接此虚拟设备吗?
无法连接虚拟设备ide1:0,主机上没有相对应的设备,您 要在每次开启此虚拟机时都尝试连接此虚拟设备吗? 运行VMware,出现以上错误. ide1:0一般是虚拟机的光驱,配置默认选项是“使用物理驱动 ...