Как я могу обеспечить наличие очередей шершней при запуске моего веб-приложения в JBOSS 6.0? - PullRequest
2 голосов
/ 24 ноября 2010

предыдущее название было:

Как получить ссылку JNDI на очередь в JBOSS 6 с помощью Spring?

Я настроил очередь JMS следующим образом: 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>

Мое applicationContext.xml выглядит так:

<?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>

Это вывод с использованием консоли JMX 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)

что в моей книге означает, что тема связана с именем JNDI "mytopic"

Тем не менее, весна бросает

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

Похоже, что поиск справочной информации о JNDI не является проблемой, но на самом деле очереди hornet не настраиваются в момент запуска приложения.

Если я разверну приложение через некоторое время, оно будет работать нормально, потому что в это время настроены очереди шершня .

Есть ли способ указать, что приложение не запустится до тех пор, пока очереди не будут, или параметр конфигурации для jboss удерживает развертывание до тех пор, пока не запустится остальные?

Ответы [ 3 ]

2 голосов
/ 15 декабря 2010

Я успешно использовал механизм «зависит» в Jboss 4.2. С его помощью вы можете указать, что что-то зависит от чего-то другого (либо используя xml-дескрипторы, либо для ejb3 вы можете использовать аннотации). Вот ссылка, чтобы вы начали

0 голосов
/ 25 ноября 2010

Я не использовал HornetQ, я только ради вашего вопроса прочитал учебник по настройке Spring вместе с HornetQ . Там есть раздел о настройке jndi.properties. Это, вероятно, чтобы убедиться, что HornetQ регистрирует свои вещи в контексте JBoss JNDI.

Вы уверены, что у вас есть файл, который они предлагают, и он правильно расположен?

0 голосов
/ 24 ноября 2010

Что если вы добавили префикс java:/ (такой же, как у вас для JmsXA)?то есть

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

Кстати, я не вижу ничего определенного под JmsXA name в вашем дампе JNDIУ вас тоже может быть проблема с этим.

...