2014-10-05 122 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替换特殊字符。