Azure Service Bus AMQP Using Java SDK : Peer did not create remote endpoint for link, target: amqp_queue


 

While setting up an Azure Service Bus AMQP Java project in Eclipse by following the code from How to Use JMS with AMQP 1.0 in Azure with Eclipse I continuously got the following error

javax.jms.JMSException: Peer did not create remote endpoint for link, target: amqp_queue_portal at org.apache.qpid.amqp_1_0.jms.impl.MessageProducerImpl.<init>(MessageProducerImpl.java:77) at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createProducer(SessionImpl.java:348) at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createProducer(SessionImpl.java:63) at SimpleSenderReceiver.<init>(SimpleSenderReceiver.java:41) at SimpleSenderReceiver.main(SimpleSenderReceiver.java:59)

Caused by: org.apache.qpid.amqp_1_0.client.Sender$SenderCreationException: Peer did not create remote endpoint for link, target: testqueue at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:171) at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:104) at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:97) at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:83) at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:69) at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:63) at org.apache.qpid.amqp_1_0.client.Session.createSender(Session.java:74) at org.apache.qpid.amqp_1_0.client.Session.createSender(Session.java:66) at org.apache.qpid.amqp_1_0.jms.impl.MessageProducerImpl.<init>(MessageProducerImpl.java:72)

The Queue in this case was created from the Azure Management Portal. A search on internet pointed to a lot of hits on stackoverflow but none of them seemed to provide a conclusive answer. So I debugged the Java code and read through some of the AMQP documentation at

https://apache.googlesource.com/qpid/+/c8d0fb167d8fc89fcb27823414454675b60a9dc1/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java

http://msdn.microsoft.com/en-us/library/azure/hh780773.aspx

Later I created a Queue using code instead of the Management Portal and with this new queue the Java code worked fine.

connectionString  =     CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
var namespaceManager =
    NamespaceManager.CreateFromConnectionString(connectionString);
 
            if (!namespaceManager.QueueExists("amqp_queue_code"))
            {
                namespaceManager.CreateQueue("amqp_queue_code");
            }
 

So I used Service Bus Explorer to find the property difference of the queues  amqp_queue_portal & amqp_queue_code. Found that it fails if the Queue is “Partitioned”. AMQP seems to need message ordering. If I create a queue from portal by quick create it will create a ”Partitioned“ queue by default. So when you create a queue from portal Select > Custom Create > Un-check the ”Enable Partitioning“. It should look as below.

clip_image001

I am able to get the messages now using the Java AMQP code published at http://azure.microsoft.com/en-us/documentation/articles/service-bus-java-how-to-use-jms-api-amqp/

clip_image003

Hope this blog helps you overcome the javax.jms.JMSException: Peer did not create remote endpoint for link, target: amqp_queue_portal error.

Angshuman Nayak

Cloud Integration Engineering


Comments (4)

  1. Juergen M says:

    Just tried the sample code at azure.microsoft.com/…/service-bus-java-how-to-use-jms-api-amqp and even with not partitioned queues I'm getting the same exception:

    javax.jms.JMSException: Peer did not create remote endpoint for link, target: queue2

    at org.apache.qpid.amqp_1_0.jms.impl.MessageProducerImpl.&lt;init&gt;(MessageProducerImpl.java:77)
    
    at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createProducer(SessionImpl.java:348)
    
    at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createProducer(SessionImpl.java:63)
    
    at com.microsoft.samples.jms.simple_amqp.SimpleSenderReceiver.&lt;init&gt;(SimpleSenderReceiver.java:48)
    
    at com.microsoft.samples.jms.simple_amqp.SimpleSenderReceiver.main(SimpleSenderReceiver.java:83)
    

    with servicebus.properties:

    servicebus.properties – sample JNDI configuration

    java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory

    Register a ConnectionFactory in JNDI using the form:

    connectionfactory.[jndi_name] = [ConnectionURL]

    connectionfactory.SBCF = amqps://SimpleSend:[encodedKeyhere]@[myNamespace].servicebus.windows.net

    Register some queues in JNDI using the form

    queue.[jndi_name] = [physical_name]

    topic.[jndi_name] = [physical_name]

    queue.QUEUE = queue1

  2. Juergen M says:

    And when switching from 'qpid-amqp-1-0-client-jms' version 0.22 to 0.32 the exception on creating the producer changes to:

    javax.jms.JMSException: java.util.concurrent.TimeoutException

    at org.apache.qpid.amqp_1_0.jms.impl.MessageProducerImpl.&lt;init&gt;(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 com.microsoft.samples.jms.simple_amqp.SimpleSenderReceiver.&lt;init&gt;(SimpleSenderReceiver.java:48)
    
    at com.microsoft.samples.jms.simple_amqp.SimpleSenderReceiver.main(SimpleSenderReceiver.java:83) 
    
  3. Juergen M says:

    And finally found the problem. You can not use the shared access policy from the Service Bus namespace, but you have to define an explicit one for the queue. Afterwards everything worked fine.

  4. Lopen says:

    On our side, after trying azure+amqp implementation with an high rate of queue/topic usage, we finally decide to switch to azure sdk library. This works better! no more connection/session/consumer to manage!

    azure.microsoft.com/…/service-bus-java-how-to-use-queues

Skip to main content