[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