كيف يمكنني التأكد من أن طوابير الدبور موجودة عندما يبدأ الويب الخاص بي في JBOSS 6.0؟
سؤال
العنوان السابق كان:
كيف يمكنني الحصول على إشارة JNDI إلى قائمة انتظار داخل JBOSS 6 باستخدام الربيع؟
قمت بتكوين قائمة انتظار 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]
تحديث
يبدو أن الأمر ليس مشكلة في الواقع في البحث عن مرجع JNDI ، ولكن في الواقع لم يتم تكوين طوابير الدبور في الوقت الذي يبدأ فيه التطبيق.
إذا قمت بنشر الطلب في وقت لاحق ، فسيتم تشغيله بشكل جيد ، لأنه في هذا الوقت طوابير الدبور نكون تكوين.
هل هناك طريقة لتحديد أن التطبيق لن يبدأ حتى تكون قوائم الانتظار ، أم أن خيار التكوين لـ JBOSS ليحتفظ بالنشر حتى يتم تشغيل الباقي؟
المحلول
لقد استخدمت بشكل ناجح آلية "تعتمد" في JBOSS 4.2. مع ذلك ، يمكنك تحديد أن شيئًا ما يعتمد على شيء آخر (إما باستخدام واصفات XML أو لـ EJB3 يمكنك استخدام التعليقات التوضيحية). هنا رابط للحصول عليك بدأت
نصائح أخرى
ماذا لو أضفت java:/
بادئة (نفس ما لديك لـ JMSXA)؟ بمعنى آخر
<jee:jndi-lookup id="jmsDestination" jndi-name="java:/mytopic" expected-type="javax.jms.Topic" />
راجع للشغل ، لا أرى أي شيء محدد تحت JmsXA
الاسم في تفريغ JNDI الخاص بك. قد تواجه مشكلة في ذلك أيضًا.
لم أستخدم Hornetq ، لقد قمت فقط من أجل سؤالك اقرأ البرنامج التعليمي عند إعداد الربيع مع Hornetq. هناك قسم حول الإعداد jndi.properties
. ربما يكون هذا هو التأكد من قيام Hornetq بتسجيل أغراضه في سياق JBOSS JNDI.
هل أنت متأكد من أن لديك ملف كما يقترحون ويتم وضعه بشكل صحيح؟