Исключение JMS и ActiveMQ - PullRequest
       24

Исключение JMS и ActiveMQ

6 голосов
/ 06 февраля 2012

Я пробую проект для школы с использованием JMS и ActiveMQ.

Я скопировал блок кода из книг О'Рейли "Java Message Service 2nd Edition Jun 2009".Он использует метод публикации и подписки и фактически представляет собой небольшой чат, в котором каждый, кто связан с темой, может отправлять сообщения всем, и каждый может видеть сообщения всех остальных.Я компилирую программу, и все в порядке, я пытаюсь запустить ее, и это дает мне следующее исключение:

Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory]

Я обнаружил, что эта проблема может быть по двум причинам:

  1. activemq-all-5.2.0.jar не добавлен в classpath.
    НО добавил его в classpath (EnvironmentVariables-> выберите ClassPath-> Edit и добавьте следующее: "D: \ Programming \ JMS \ ActiveMQ \ apache-activemq-5.2.0 "(ЭТО ТАК, КАК ВЫ ДОБАВЛЯЕТЕ ЭТО НЕТ?!?!)
  2. Файл jndi.properties не определен правильно или не был добавлен в путь к классам.
    НОЯ создал его и добавил его папку в classpath. Вот что он содержит:

    java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url = tcp://localhost:61616
    java.naming.security.principal=system
    java.naming.security.credentials=manager
    connectionFactoryNames = TopicCF
    topic.topic1 = jms.topic1
    

В чем проблема? Я пытался заставить его работать целую вечность.что-то не так?: (

Имеет ли значение путь к файлу jndi.properties? Или его нужно только поместить в classpath, и отсюда его можно найти?

Я также запустил activemq.batиз папки bin D: \ Programming \ JMS \ ActiveMQ \ apache-activemq-5.2.0 \ bin \

[Редактировать] --------------------- Так что это работает в Eclipse, НО Теперь я правильно добавил файл .jar в переменные окружения, и яЗапустите клиент из окна Windows.Это не дает никаких ошибок, когда я пишу в консоли Eclipse, оно появляется в консоли cmd, все в порядке, но когда я пытаюсь писать в cmd, выдает ошибку в этой строке:

publisher.publish(message);

итам написано

java.lang.NoSuchMethodError: org.apache.activemq.ActiveMQMessageProducerSupport.getDestination()Ljavax/jms/Destination;

Есть идеи?Я бы очень хотел иметь возможность запустить его в CMD.: (

--------------------- [/ Edit]

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

Я сейчас нахожусь в Linux, но держу пари, что это должно быть:

D: \ Programming \ JMS \ ActiveMQ \ apache-activemq-5.2.0. jar

Кроме того, если вы запустите его с Eclipse и перейдете в Project -> Build Path и этот jar, то проблем быть не должно.В любом случае вы можете опубликовать переменную CLASSPATH?

РЕДАКТИРОВАТЬ

Я не могу вам помочь, если вы не можете мне помочь.Это связано с любыми другими будущими вопросами или работой в целом, предоставьте подробности - это всегда полезно.Будет очень полезно, если вы предоставите команду EXACT, которую вы выполняете в CMD, и код класса, где это происходит.

java.lang.NoSuchMethodError

обычно это означает, что баночка на месте, класс тоже, НО метод не.Это происходит, когда вы компилируете одну версию jar и во время выполнения предоставляете jar, в котором был удален этот метод, поэтому JRE не может найти его, выдавая ошибку.

Я только что протестировал на своем компьютере

Я не понимаю, почему это не работает для вас, но это для меня.Вот мой класс:

 package com.test;
 public class Publisher {
 public static void main(String[] args) {
try{

        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = factory.createConnection();
        ActiveMQSession session = (ActiveMQSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        Topic destination = session.createTopic("FOO.TEST");    
        TextMessage textMessage = session.createTextMessage("Sample Payload");

        TopicPublisher publisher = session.createPublisher(destination);

        publisher.publish(textMessage);

        session.close();
        connection.close();

        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

Все хорошо, если я запускаю его из затмения с одной зависимостью в Maven:

<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.2.0</version>

Затем я делаю это с java и javac

javac -classpath /home/eugen/.m2/repository/org/apache/activemq/activemq-core/5.2.0/activemq-core-5.2.0.jar:/home/eugen/.m2/repository/javax/jms/jms/1.1/jms-1.1.jar  Publisher.java 

Обратите внимание, что я добавил только две банки.

Затем java:

 java -classpath  /home/eugen/.m2/repository/org/apache/activemq/activemq-core/5.2.0/activemq-core-5.2.0.jar:/home/eugen/.m2/repository/commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar:/home/eugen/.m2/repository/org/apache/camel/camel-core/1.5.0/camel-core-1.5.0.jar:/home/eugen/workspace/t/src/main/java/:/home/eugen/.m2/repository/javax/jms/jms/1.1/jms-1.1.jar:/home/eugen/.m2/repository/org/apache/geronimo/specs/geronimo-j2ee-management_1.0_spec/1.0/geronimo-j2ee-management_1.0_spec-1.0.jar com.test.Publisher

Я добавилнесколько необходимых банок к пути к классам и запустить его - он отлично работает.

Ура, Евгений.

0 голосов
/ 01 октября 2017

Я столкнулся с той же проблемой, и это был пробел (или то, что казалось пробелом) в конце конфигурации моего свойства.

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory

Также обратите внимание, что вам не обязательно вставлять файл jar в код вашего клиента.Простое включение activemq-all в качестве зависимости maven также будет работать.

...