اكتيفMQ:مشكلة في البحث في قائمة الانتظار
سؤال
لقد قمت بإعداد قائمة انتظار عن طريق تكوينها في activemq.xml (إصدار ActiveMQ 5.2.0) كما هو موضح في توثيق.
<destinations>
<queue physicalName="FOO.BAR" />
<queue physicalName="DUMMY" />
</destinations>
أحاول الوصول إليه من Java (على نفس المضيف) باستخدام الكود التالي:
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
properties.put(Context.PROVIDER_URL, "tcp://localhost:61616");
context = new InitialContext(properties);
factory = (ConnectionFactory) context.lookup("ConnectionFactory");
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queueName = "DUMMY"; // which can be either FOO.BAR or DUMMY
dest = (Destination) context.lookup(queueName);
أتلقى الخطأ التالي، على الرغم من أن قائمة الانتظار مرئية في jconsole (Tree / org.apache.activemq / Queue):
javax.naming.NameNotFoundException: DUMMY
من فضلك قل لي ما أفعله خطأ.جزيل الشكر!
المحلول
أولا ليس عليك ذلك صراحة إنشاء أي قوائم الانتظار في الوسيط على الرغم من أنه لا ضرر.
كما أن الوجهات المتاحة في الوسيط لا يتم تعيينها بطريقة سحرية تلقائيًا في سياق JNDI لتتمكن من استخدام نوع ما من اسم JNDI.
انت تستطيع فعل ذالك صراحة كما هو موضح هنا.إذا كنت تريد السكان السحريين التلقائيين لـ JNDI، فاستخدم اصطلاح تسمية JNDI الخاص بـ قوائم الانتظار الديناميكية/DUMMY كاسم JNDI الذي تبحث عنه (كما هو موضح في ملف إنشاء الوجهات بشكل ديناميكي)
نصائح أخرى
همم..حسنًا، عندما أرغب في الاستماع إلى قائمة الانتظار، عادةً ما أفعل شيئًا كهذا.(الواردات من javax.jms)
قائمة الانتظار؛
// Connect to ActiveMQ
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(messageBrokerURL);
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// List to Dummy Queue
queue = session.createQueue("DUMMY");
messageConsumer = session.createConsumer(queue);
messageConsumer.setMessageListener(queueHandler);
// Start the connection
connection.start();
وتأكد من أن المعالج الخاص بك يقوم بتنفيذ messageListener.