Como posso garantir que as filas do Hornet existam quando meu webApp começar no JBoss 6.0?
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?
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?