2014-10-05 4 views
2

Я пытаюсь подключиться Azure автобус службы от Java клиента с протоколом AMQP
Подключение Azure автобусное через Java клиент

Я следовать инструкциям по следующей ссылке:
http://azure.microsoft.com/en-us/documentation/articles/service-bus-java-how-to-use-jms-api-amqp/

1), созданного сервисную шину на портале Azure с пространством имен «availo» и очередь с именем «queue1 ' 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:

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 

Wasted много часов, чтобы понять, что я делаю неправильно без успеха может кто-нибудь помочь?
Ваш ответ высоко оценен.

+0

Вы могли решить эту проблему? Каково было решение, если вы можете поделиться? –

ответ

0

Насколько я знаю, имя пользователя/эмитента не подходит.

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

должно быть:

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

в качестве имени пользователя из AMQP заполняется с именем эмитента от СО конечной точки и что «владелец» по умолчанию (пожалуйста, дублированный проверить с вашей информации на установление соединения azure sb)

Надеюсь, это поможет.

С уважением,

Рене

2

Убедитесь, что ваша очередь не имеет разделения включена. ServiceBus не поддерживает AMQP с секционированными очередями, однако очереди создаются с включенным разделением по умолчанию.

У меня была такая же ошибка, и повторное создание очереди с помощью «Включить разделение» не было проверено для меня.

См секционированных Entities Ограничения раздел в нижней части этой статьи: 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 –

1

Этот ответ предназначен для начинающих с Service Bus, как и я.

Первое, что нужно сделать для раздельной очереди/темы для AMQP, поскольку разделение не поддерживается, как и другой ответ. Для создания очереди с Azure Portal нам нужно снять флажок «Включить разделение». По умолчанию объекты включены с разделением в служебной шине.

Попадая на эту проблему, у меня была такая же проблема, когда я пытался использовать Java-клиент в качестве прослушивателя в очередь, используя реализацию QMS в JMS с AMQP, как в example. Проблема заключалась в том, что очередь не была настроена, хотя ServiceBus был на Azure Portal.

Убедитесь, что вы добавили правильную конфигурацию в свою очередь на портале с правом доступа и именами политик, если вы планируете использовать разные имена политик для очереди отправки/прослушивания (см., Если полезно this). PolicyName OF QUEUE NOT SERVICE BUS - это тот, который будет использоваться для аутентификации SAS, эквивалентной имени пользователя в ACS, а первичный/вторичный ключ эквивалентен паролю в ACS в файле config (servicebus.properties).

Сначала попробуйте использовать Первичный ключ. Если вы получите ошибку аутентификации, вы можете попробовать дополнительный ключ. Если у вас есть специальные символы в ключе, например, я пересылал слэш (/), заменил его соответствующим значением UTF-8. Поэтому мне пришлось использовать% 2F для замены/в ключе в файле конфигурации.

Это очистило мои проблемы. Надеюсь это поможет!!

PTR (PointsToRemember):

  1. Он не предложил использовать созданный из кода использовать для AMQP как и в текущем USECASE. Когда вы создаете очередь из кода с использованием API-интерфейсов Service Bus, он создается с включенным разделением и без конечной точки FOR THE QUEUE. Итак, вы закончите с двумя исключениями:

    - Никакой конечной точки не создано, как в вопросе об этом контексте.

    - Когда вы заходите на портал, настройте его прямо на портале и в своем конфигурационном файле, тогда вы получите «AMQP не поддерживается над Partitioned Entities» (вы уже знаете это!). Поэтому вам нужно вернуться и создать очередь на портале, снова отключив разделение и настройте его. Вид двойной работы. Поэтому лучше использовать очередь, которая создается и настроена для AMQP.

  2. Если у вас есть специальные символы в первичных/вторичных ключах, вы пытаетесь их регенерировать, вместо того чтобы использовать их и заменять специальные символы соответствующим UTF-8 в файле конфигурации.
0

Совет: при использовании более поздней версии Qpid (qpid-JMS-клиент-0.11.1.jar), то ConnectionFactory свойство отличается:

connectionfactory.myFactoryLookup = connectionfactory.myFactoryLookup = amqps://example-open-bus.servicebus.windows.net?amqp.idleTimeout=150000&jms.username=somePolicy&jms.password=aM2k3PaZY5jdIkmGKm7G%2FcH%2BUFQaFAgHIYc3dSkuiLI%3D 

видеть пост ->How can I Send/Receive a message from Azure Service Bus from Qpid JMS (qpid-jms-client-0.11.1.jar)?

Смежные вопросы