[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. spring中使用缓存

    一.启用对缓存的支持 Spring 对缓存的支持最简单的方式就是在方法上添加@Cacheable和@CacheEvict注解, 再添加注解之前,必须先启用spring对注解驱动的支持,基于java的配 ...

  2. 80C51单片机介绍

    80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点. 增加了如乘(MUL).除(DIV).减(SUBB).比较(CMP).16位数据指针.布 ...

  3. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_元数据

    1.元数据简介 全称:metadata 属性:数据表集合 产地:面向 CLR 的编译器在托管模块中生成 2.元数据内部结构及与托管模块的关系 [概述] 托管模块中包含着元数据,元数据是由一组数据表组成 ...

  4. 数位dp 简单入门

    推荐博客 推荐博客 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听的名字,数位的含义:一个数有 ...

  5. 上传文件中文文件名乱码的解决方法以及iconv函数的使用

    http://www.jb51.net/article/14530.htm 一般客户端是什么格式就展示什么格式,比如浏览器的UTF-8,windows的GBK

  6. PHP7.1新特性一览

    PHP7.0的性能是PHP5.6的两倍 http://www.phpchina.com/article-40237-1.html 可空类型 list 的方括号简写 void 返回类型 类常量属性设定 ...

  7. 工具类_GsonUtils

    import java.lang.reflect.Type; import com.google.gson.Gson; /** * Gson工具类 2015-02-01<br/> * 1, ...

  8. 第一章javascript简介

    javascript 当诞生于1995 最开始是目的是处理在服务器端进行的表单验证:让其在服务器端验证改为在服务端验证,大大提高速度(当时网络慢) 如今javascript是一门功能全面的语言,包含闭 ...

  9. 查看正在运行的sql

    SELECT [Spid] = session_id ,ecid ,[Database] = DB_NAME(sp.dbid) ,[User] = nt_username ,[Status] = er ...

  10. 转 JDBC连接数据库(二)——连接池

    https://www.cnblogs.com/xiaotiaosi/p/6398371.html 数据库保持长连接,不过一直都是idle,除非有用户激活连接,这样后果是无法删除用户,但是不影响数据库 ...