Come posso assicurarmi che le code Hornet ci sono quando il mio webapp inizia in JBoss 6.0?
Domanda
titolo precedente era:
Come faccio a ottenere un riferimento JNDI per una coda all'interno di JBOSS 6 usando Primavera?
Ho configurato una coda JMS come questo, che si trova in un file 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>
Il mio applicationContext.xml si presenta così:
<?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>
Questa è l'uscita utilizzando il 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)
, che nei miei mezzi del libro, l'argomento è legato al nome JNDI "MyTopic"
fa tuttavia Primavera tiro
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]
Aggiorna
Sembra, che non è in realtà un problema guardando il riferimento JNDI, ma in realtà che le code Hornet non sono configurati nel momento in cui si avvia l'applicazione.
Se schiero l'applicazione qualche tempo dopo, verrà eseguito bene, perché in questo momento le code Hornet sono configurato.
C'è un modo per specificare che l'applicazione non si avvierà fino le code sono, o è l'opzione di configurazione per il JBoss per possesso di distribuzione fino all'avvio il resto?
Soluzione
Ho successo impiegato il "dipende" meccanismo a Jboss 4.2. Con esso è possibile specificare che qualcosa dipende da qualcosa di diverso (sia utilizzando descrittori XML o per EJB3 è possibile utilizzare le annotazioni). Ecco un link per ottenere iniziato
Altri suggerimenti
Che cosa succede se si è aggiunto il prefisso java:/
(lo stesso che avete per JmsXA)? cioè.
<jee:jndi-lookup id="jmsDestination" jndi-name="java:/mytopic" expected-type="javax.jms.Topic" />
A proposito, non vedo nulla di definito sotto il nome JmsXA
nella discarica JNDI. Si potrebbe avere un problema con questo anche.
Non ho usato HornetQ, ho solo per il gusto della tua domanda leggere il esercitazione sulla creazione di primavera insieme a HornetQ . C'è una sezione ci sull'impostazione jndi.properties
. Questo è probabilmente per assicurarsi HornetQ registra la sua roba nel contesto JBoss JNDI.
Sei sicuro di avere un file come essi suggeriscono ed è posizionato correttamente?