Autobús de servicio de conexión Azure a través de cliente Java
jndi amqp (4)
Estoy intentando conectar el bus de servicio de Azure desde el cliente de Java con el protocolo AMQP
Sigo las instrucciones en el siguiente enlace:
http://azure.microsoft.com/en-us/documentation/articles/service-bus-java-how-to-use-jms-api-amqp/
1) creó un bus de servicio en el portal de Azure con el espacio de nombre '' availo '' y una cola llamada '' queue1 ''
2) de la información de conexión del bus de servicio Tengo lo siguiente:
SharedAccessKeyName = RootManageSharedAccessKey
SharedAccessKey = {key}
3) creado el archivo "servicebus.properties" para la búsqueda JNDI
connectionfactory.SBCF = amqps://RootManageSharedAccessKey:encoded(key)@availo.servicebus.windows.net
queue.QUEUE = queue1
4) debajo está mi aplicación java main simple con todos los jar requeridos (qpid) en la ruta de la clase.
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();
}
}
Cuando ejecuto el programa, obtengo la excepción a continuación en la línea de código:
MessageProducer producer = sendSession.createProducer(queue);
Excepción:
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
Perdí muchas horas para entender qué estoy haciendo mal sin éxito. ¿Alguien puede ayudarme?
tu respuesta es muy apreciada
por lo que puedo ver, el nombre de usuario / emisor no encaja.
amqps://RootManageSharedAccessKey:encoded(key)@availo.servicebus.windows.net
debiera ser:
amqps://owner:encoded(key)@availo.servicebus.windows.net
como el nombre de usuario de amqp se rellena con el nombre del emisor del punto final sb y eso es "propietario" por defecto (pls dbl verifique con su información de conexión del azure sb)
Espero que esto ayude.
Saludos,
René
Asegúrese de que su cola no tenga habilitada la partición. ServiceBus no admite AMQP con colas particionadas, sin embargo, las colas se crean con la partición habilitada de forma predeterminada.
Tuve exactamente el mismo error, y al volver a crear la cola con "Habilitar particionado", la opción no verificada me la resolvió.
Consulte la sección Limitaciones de entidades particionadas en la parte inferior de este artículo: https://msdn.microsoft.com/en-us/library/azure/dn520246.aspx
Las colas y temas particionados solo están disponibles a través de SBMP o HTTP / HTTPS. El soporte de AMQP se agregará en el futuro.
Esta respuesta es para principiantes con Service Bus, como yo.
Lo primero es tener cola / tema sin particiones para AMQP, ya que las particiones no son compatibles, como se dijo en otras respuestas. Necesitamos desmarcar ''Habilitar particionado'' al crear la cola desde Azure Portal. Por defecto, las entidades se habilitan con Partitioning en el bus de servicio.
Al llegar al problema, tuve el mismo problema cuando intentaba usar Java Client como Listener para la cola usando la implementación Qpid de JMS con AMQP como en el ejemplo . El problema era que la Cola no estaba configurada aunque el ServiceBus estaba, en el Portal de Azure.
Asegúrese de haber agregado la configuración correcta a su cola en el portal con los permisos correctos y los nombres de las políticas, si planea usar diferentes policyNames para la cola de envío / escucha (consulte si esto es útil). El policyName DEL BUS DE QUEUE NOT SERVICE es el que se utilizará para la Autenticación SAS equivalente al nombre de usuario en ACS y la clave primaria / secundaria es equivalente a la contraseña en ACS en el archivo config (servicebus.properties).
Intenta usar la clave principal primero. Si obtiene un error de autenticación, puede probar la clave secundaria. Si tiene caracteres especiales en la clave, como si hubiera reviado una barra inclinada (/), reemplácela con el valor UTF-8 correspondiente. Así que tuve que usar% 2F para reemplazar / en la clave, en el archivo de configuración.
Eso despejó mis problemas. ¡¡Espero que esto ayude!!
PTR (PointsToRemember):
No se sugiere usar código creado para usar para AMQP como en el caso de uso actual. Cuando crea una cola de código utilizando Service Bus Java API, se crea con la partición habilitada y sin punto final creado PARA LA COLA. Entonces, terminarás con dos excepciones,
- No se creó un punto final, como en la pregunta de este contexto.
--Una vez que vayas al portal configúralo en el portal y en tu archivo de configuración, obtendrás ''AMQP no compatible con entidades particionadas'' (¡Ya lo sabes!). Por lo tanto, debe volver atrás y crear una cola en el portal para deshabilitar el particionamiento y configurarlo. Tipo de trabajo doble ... Así que mejor use la cola que se crea y configura para AMQP.
- Si tiene caracteres especiales en las teclas principales / secundarias, intente regenerarlos, en lugar de usarlos y reemplazar los caracteres especiales con el UTF-8 correspondiente en el archivo de configuración.
Sugerencia: cuando se utiliza una versión posterior de Qpid (qpid-jms-client-0.11.1.jar), la propiedad connectionfactory es diferente:
connectionfactory.myFactoryLookup = connectionfactory.myFactoryLookup = amqps://example-open-bus.servicebus.windows.net?amqp.idleTimeout=150000&jms.username=somePolicy&jms.password=aM2k3PaZY5jdIkmGKm7G%2FcH%2BUFQaFAgHIYc3dSkuiLI%3D
ver otra publicación -> ¿Cómo puedo enviar / recibir un mensaje de Azure Service Bus de Qpid JMS (qpid-jms-client-0.11.1.jar)?