2014-10-05 123 views
2

我想Azure的服務總線從Java客戶端AMQP協議連接
連接Azure的服務總線

我按照以下鏈接指令:)創建
http://azure.microsoft.com/en-us/documentation/articles/service-bus-java-how-to-use-jms-api-amqp/

1服務總線在Azure門戶中的名稱空間'availo'和一個名爲'隊列1'
的隊列2)來自服務總線連接信息我已閱讀翼:

SharedAccessKeyName = RootManageSharedAccessKey
SharedAccessKey = {}鍵

3)創建 「servicebus.properties」 文件的JNDI查找

connectionfactory.SBCF = amqps://RootManageSharedAccessKey:encoded(key)@availo.servicebus.windows.net 
    queue.QUEUE = queue1 

4)下面是我的簡單的Java應用程序主帶所有需要的罐子(qpid)都在類路徑中。

public static void main(String[] args) { 

    try { 
     Hashtable<String, String> env = new Hashtable<String, String>(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, 
       "org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory"); 
     env.put(Context.PROVIDER_URL, 
       "C:\\Users\\Assaf-PC\\Documents\\GitHub\\availo\\rest-api\\src\\main\\resources\\servicebus.properties"); 
     Context context = new InitialContext(env); 
     // Lookup ConnectionFactory and Queue 
     ConnectionFactory cf = (ConnectionFactory) context.lookup("SBCF"); 
     Destination queue = (Destination) context.lookup("QUEUE"); 
     // Create Connection 
     Connection connection = cf.createConnection(); 
     // Create sender-side Session and MessageProducer 
     Session sendSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     MessageProducer producer = sendSession.createProducer(queue); 
    } catch (Exception e) { 
     e.getLocalizedMessage(); 
    } 

} 

當我跑我得到異常下面的代碼行的程序:

MessageProducer producer = sendSession.createProducer(queue); 

例外:

Exception in thread "main" javax.jms.JMSException: Peer did not create remote endpoint for link, target: queue1 
at org.apache.qpid.amqp_1_0.jms.impl.MessageProducerImpl.<init>(MessageProducerImpl.java:98) 
at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createProducer(SessionImpl.java:390) 
at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createProducer(SessionImpl.java:59) 
at availo.rest.services.ServiceBus.main(ServiceBus.java:43) 
    Caused by: org.apache.qpid.amqp_1_0.client.Sender$SenderCreationException: Peer did not create remote endpoint for link, target: queue1 
at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:191) 
at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:119) 
at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:112) 
at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:98) 
at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:84) 
at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:78) 
at org.apache.qpid.amqp_1_0.client.Session$1.<init>(Session.java:90) 
at org.apache.qpid.amqp_1_0.client.Session.createSender(Session.java:89) 
at org.apache.qpid.amqp_1_0.jms.impl.MessageProducerImpl.<init>(MessageProducerImpl.java:86) 
... 3 more 

浪費很多時間來了解我在做什麼錯沒有成功任何人都可以幫忙
您的回答非常感謝。

+0

你能解決這個問題嗎?如果你能分享,解決方案是什麼? – 2017-11-14 09:52:34

回答

0

據我可以看到用戶名/發行人名稱不適合。

amqps://RootManageSharedAccessKey:encoded(key)@availo.servicebus.windows.net 

應該是:

amqps://owner:encoded(key)@availo.servicebus.windows.net 

從AMQP的用戶名充滿了從SB端點發行人的名字,那就是「所有者」每默認(請DBL用的你的連接信息檢查azure sb)

希望這會有所幫助。

問候,

2

確保您的排隊未啓用分區。 ServiceBus不支持使用分區隊列的AMQP,但是隊列是在默認啓用分區的情況下創建的。

我有這個完全相同的錯誤,並重新創建與「啓用分區」隊列取消選中解決了我。

分區實體限制部分在這篇文章的底部:https://msdn.microsoft.com/en-us/library/azure/dn520246.aspx

分區隊列和主題只能通過SBMP或HTTP/HTTPS可用。 AMQP支持將在未來添加。

+0

服務總線現在支持AMQP的分區隊列。 https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioned-queues-and-topics-amqp-overview – 2016-11-16 08:59:28

1

這個答案適用於Service Bus的初學者,和我一樣。

第一件事就是不支持AMQP的未分區隊列/主題作爲分區,就像其他回答說的那樣。我們需要在從Azure Portal創建隊列時取消選中「啓用分區」。默認情況下,在服務總線中啓用分區功能。

來到這個問題,我已經當我試圖用Qpid實現JMS與AMQP作爲在example使用Java客戶端爲收聽到隊列同樣的問題。問題在於,即使Azure門戶中的ServiceBus處於隊列狀態,也沒有配置隊列。

如果您打算使用不同的policyNames發送到收聽隊列(請參閱this有幫助),請確保您已在正確的權限和策略名稱的門戶中爲您的隊列添加了正確的配置。 「隊列非服務總線」的policyName是用於與SAS中的用戶名相對應的SAS身份驗證的名稱,主要/輔助鍵與config(servicebus.properties)文件中的ACS中的密碼相同。

先嚐試使用主鍵。如果您遇到身份驗證錯誤,那麼您可以嘗試使用輔助鍵。如果密鑰中有特殊字符(例如我已經轉發了斜槓(/)),請將其替換爲相應的UTF-8值。因此,我必須使用%2F來替換密鑰中的/在配置文件中。

這清除了我的問題。希望這可以幫助!!

PTR(PointsToRemember):

  1. 它不建議使用從代碼創建用於AMQP作爲當前用例。當您使用Service Bus Java API從代碼創建隊列時,它將在啓用分區的情況下創建,並且不會爲隊列創建端點。所以,最後你會得到兩個例外:

    - 沒有創建終點,就像在這個上下文的問題中一樣。

    - 一旦你進入門戶網站並在你的配置文件中進行配置,那麼你會得到'分區實體不支持AMQP'(你已經知道了!)。因此,您必須返回並在門戶中創建隊列,然後再次禁用分區並對其進行配置。雙重工作類型..所以最好使用創建和配置AMQP的隊列。

  2. 如果主/副鍵中有特殊字符,則嘗試重新生成它們,而不是使用它們,並用配置文件中相應的UTF-8替換特殊字符。