Wie kann ich sicherstellen, dass die Hornisse Warteschlangen gibt es, wenn mein Webapp in JBOSS 6.0 startet?
Frage
vorheriger Titel war:
Wie erhalte ich eine JNDI-Referenz in eine Warteschlange innerhalb JBOSS 6 Feder mit?
konfigurierte I eine JMS-Warteschlange wie diese, die in einer MyTopic-HornetQ jms.xml-Datei ist:
<?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>
Meine applicationContext.xml sieht wie folgt aus:
<?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>
Dies ist die Ausgabe der JMX-Konsole org.jboss.naming.JNDIView mit:
+- 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)
, die in meinem Buch Mittel, das Thema an den JNDI-Namen gebunden ist „MyTopic“
Dennoch tut Frühling throw
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]
UPDATE
Es scheint, dass es nicht wirklich ein Problem sucht, ist die JNDI-Referenz, aber tatsächlich, dass die Hornisse Warteschlangen werden nicht zum Zeitpunkt konfiguriert, wenn die Anwendung gestartet wird.
Wenn ich die Anwendung einige Zeit später einsetzen, wird es ganz gut, weil zu diesem Zeitpunkt die Hornisse Warteschlangen sind konfiguriert ausgeführt werden.
Gibt es eine Möglichkeit zu geben, dass die Anwendung nicht, bis beginnt die Warteschlangen sind, oder die eine Konfigurationsoption für den Jboss zu halten, Einsatz, bis der Rest gestartet wird?
Lösung
Ich habe erfolgreich die „hängt“ -Mechanismus in Jboss 4.2 eingesetzt. Mit ihm können Sie angeben, dass etwas auf etwas anderes abhängt (entweder XML-Deskriptoren oder für ejb3 verwenden, können Sie Anmerkungen verwenden). Hier ist ein Link gestartet
Andere Tipps
Was ist, wenn Sie das java:/
Präfix (das gleiche wie Sie für JmsXA haben)? d.
<jee:jndi-lookup id="jmsDestination" jndi-name="java:/mytopic" expected-type="javax.jms.Topic" />
BTW, ich sehe nichts unter JmsXA
Namen definiert in Ihrem JNDI-Dump. Sie könnten auch ein Problem damit haben.
Ich habe HornetQ nicht verwendet, ich habe nur um Ihrer Frage lesen Sie die Tutorial zum Einrichten Frühling zusammen mit HornetQ . Es gibt einen Abschnitt dort über jndi.properties
einrichten. Dies ist wahrscheinlich sicher HornetQ registriert seine Sachen in JBoss-JNDI-Kontext zu machen.
Sind Sie sicher, dass Sie eine Datei wie sie vorschlagen, und es ist richtig platziert?