[2014年12月12日增长备注:12月10日,Microsoft Azure Java SDK team发布了v0.7.0版本,增长对Service Bus SAS的支持,已解决这个问题:-)]java
最近在研究Microsoft Azure,在分布式消息传递上,Amazon的AWS有SQS,而在Microsoft Azure上与之对应的是Service Bus Queue。git
Service Bus队列(Queue)的做用是,在分布式应用程序的组件通讯时,组件间不会直接相互通讯,而是经过充当中介的队列交换消息。这样能够更好地向外扩展应用程序,并加强体系结构的恢复能力,由于消息会被可靠的保存在队列中,不会因一方崩溃而丢失消息。github
值得注意的是,Azure还有另一种Queue,属于存储Storage部分,叫作Azure Queue,通过对比,因为Service Bus除Queue外还包括主题Topic\订阅Subscription功能,所以更能引发个人兴趣,知足需求,具体他们之间的区别可看微软文档:http://msdn.microsoft.com/library/azure/hh767287,很是详细。shell
微软针对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。this
可是问题出如今,Azure Java SDK仍在使用ACS的认证方式,上一个版本的Release在2014年8月4日,当时可能微软Azure Portal还未改变认证方式。这就致使了问题的出现,使用Java SDK没法完成认证。spa
二. 解决方案code
通过在网上查找信息,在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
四. 代码
1 //get connection string from config file 2 String connectionString = ConfigHandler.getConnectionString(); 3 System.out.println("Connection String: " + connectionString); 4 5 //get config 6 config = new Configuration(); 7 ServiceBusConfiguration.configureWithConnectionString(null, config, connectionString); 8 9 //create service 10 service = ServiceBusService.create(config);
运行结果:
1 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