Pergunta

O título anterior era:

Como faço para obter uma referência JNDI a uma fila no JBoss 6 usando o Spring?

Eu configurei uma fila JMS como essa, que está em um arquivo mytopic-hornetq-jms.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="urn:hornetq"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd">
    <topic name="mytopic">
        <entry name="mytopic"/>
    </topic>
</configuration>

Meu ApplicationContext.xml se parece com o seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee 
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <jee:jndi-lookup id="jmsConnectionFactory" jndi-name="java:/JmsXA" />
    <jee:jndi-lookup id="jmsDestination" jndi-name="mytopic" expected-type="javax.jms.Topic" />
</beans>

Esta é a saída usando o jmx console org.jboss.naming.jndiview:

  +- UserTransactionSessionFactory (proxy: $Proxy103 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
  +- UUIDKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.uuid.UUIDKeyGeneratorFactory)
  +- HiLoKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.hilo.HiLoKeyGeneratorFactory)
  +- SecureDeploymentManager (class: org.jnp.interfaces.NamingContext)
  |   +- remote[link -> DeploymentManager] (class: javax.naming.LinkRef)
  +- SecureManagementView (class: org.jnp.interfaces.NamingContext)
  |   +- remote[link -> ManagementView] (class: javax.naming.LinkRef)
  +- mytopic (class: org.hornetq.jms.client.HornetQTopic)
  +- DeploymentManager (class: org.jboss.aop.generatedproxies.AOPProxy$4)
  +- XAConnectionFactory (class: org.hornetq.jms.client.HornetQConnectionFactory)
  +- ProfileService (class: org.jboss.aop.generatedproxies.AOPProxy$2)
  +- SecureProfileService (class: org.jnp.interfaces.NamingContext)
  |   +- remote[link -> ProfileService] (class: javax.naming.LinkRef)
  +- queue (class: org.jnp.interfaces.NamingContext)
  |   +- DLQ (class: org.hornetq.jms.client.HornetQQueue)
  |   +- ExpiryQueue (class: org.hornetq.jms.client.HornetQQueue)
  +- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
  +- ConnectionFactory (class: org.hornetq.jms.client.HornetQConnectionFactory)
  +- jmx (class: org.jnp.interfaces.NamingContext)
  |   +- invoker (class: org.jnp.interfaces.NamingContext)
  |   |   +- RMIAdaptor (class: javax.management.MBeanServerConnection)
  |   +- rmi (class: org.jnp.interfaces.NamingContext)
  |   |   +- RMIAdaptor (class: javax.management.MBeanServerConnection)
  +- BeanValidatorFactories (class: org.jnp.interfaces.NamingContext)
  +- TomcatAuthenticators (class: java.util.Properties)
  +- XAThroughputConnectionFactory (class: org.hornetq.jms.client.HornetQConnectionFactory)
  +- ManagementView (class: org.jboss.aop.generatedproxies.AOPProxy$3)
  +- ThroughputConnectionFactory (class: org.hornetq.jms.client.HornetQConnectionFactory)

O que no meu livro significa, o tópico está vinculado ao nome JNDI "Mytopic"

No entanto, joga a primavera

18:45:29,636 ERROR [ContextLoader] Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jmsDestination': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: mytopic not bound
...
Caused by: javax.naming.NameNotFoundException: mytopic not bound
  at org.jnp.server.NamingServer.getBinding(NamingServer.java:771) [:5.0.5.Final]
  at org.jnp.server.NamingServer.getBinding(NamingServer.java:779) [:5.0.5.Final]
  at org.jnp.server.NamingServer.getObject(NamingServer.java:785) [:5.0.5.Final]
  at org.jnp.server.NamingServer.lookup(NamingServer.java:443) [:5.0.5.Final]

ATUALIZAR

Parece que, na verdade, não é um problema para procurar a referência do JNDI, mas na verdade que as filas do Hornet não estão configuradas no momento em que o aplicativo é iniciado.

Se eu implantar o aplicativo algum tempo depois, ele funcionará muito bem, porque neste momento as filas do Hornet são configurado.

Existe uma maneira de especificar que o aplicativo não começará até as filas, ou a opção de configuração é que o JBoss seja mantido de implantação até que o restante seja iniciado?

Foi útil?

Solução

Empreguei com sucesso o mecanismo "depende" no JBoss 4.2. Com ele, você pode especificar que algo depende de outra coisa (usando descritores XML ou para EJB3, você pode usar anotações). Aqui está um link para conseguir você iniciado

Outras dicas

E se você adicionasse o java:/ Prefixo (o mesmo que você tem para JMSXA)? ou seja

<jee:jndi-lookup id="jmsDestination" jndi-name="java:/mytopic" expected-type="javax.jms.Topic" />

Btw, não vejo nada definido sob JmsXA Nome em seu dump jndi. Você pode ter um problema com isso também.

Eu não usei Hornetq, só por uma questão de sua pergunta, leia o Tutorial sobre a configuração da primavera junto com o Hornetq. Há uma seção sobre a configuração jndi.properties. Provavelmente, é para garantir que o Hornetq registre suas coisas no contexto JBoss JNDI.

Tem certeza de que tem um arquivo como eles sugerem e é colocado corretamente?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top