JMS和ActiveMQ异常

And*_*dan 6 activemq-classic jms

我正在尝试使用JMS和ActiveMQ的学校项目.

我复制了O'Reilly的书籍"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]
Run Code Online (Sandbox Code Playgroud)

我发现这个问题可能是由于两个原因:

  1. activemq-all-5.2.0.jar未添加到类路径中.
    但是它添加了类路径(EnvironmentVariables->选择ClassPath->编辑并添加以下内容:"D:\ Programming\JMS\ActiveMQ\apache-activemq-5.2.0"(这是你如何添加它?!?!)
  2. jndi.properties文件未正确定义或尚未添加到类路径中.
    但我创建它并将其文件夹添加到类路径.这是它包含的内容:

    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
    
    Run Code Online (Sandbox Code Playgroud)

问题是什么?我已经尝试了很多年才能使它发挥作用.难道我做错了什么?:(

jndi.properties文件路径是否重要?或者它只需要放在类路径中,从这里可以找到它?

我还从bin文件夹D:\ Programming\JMS\ActiveMQ\apache-activemq-5.2.0\bin \运行了activemq.bat

[编辑] ---------------------所以它在Eclipse中工作,但是现在我已经在环境变量中正确添加了.jar文件并且我运行了来自windows的cmd的客户端.它没有给出任何错误,当我在Eclipse的控制台中编写时,它出现在cmd控制台中,一切正常,但是当我尝试在cmd中写入时,它会在此行给出错误:

publisher.publish(message);
Run Code Online (Sandbox Code Playgroud)

它说

java.lang.NoSuchMethodError: org.apache.activemq.ActiveMQMessageProducerSupport.getDestination()Ljavax/jms/Destination;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我真的希望能够在CMD中运行它.:(

- - - - - - - - - - -[/编辑]

Eug*_*ene 4

好吧,我现在在 Linux 上,但我打赌它必须是:

D:\Programming\JMS\ActiveMQ\apache-activemq-5.2.0。

另外,如果您使用 Eclipse 运行它并转到 Project -> Build Path 和这个 jar,那么应该不会有任何问题。无论如何,你可以发布 CLASSPATH 变量吗?

编辑

如果你不能帮助我,我也不能帮助你。这与任何其他未来的问题或一般工作有关,提供详细信息 - 它总是有帮助的。如果您提供在 CMD 中运行的确切命令以及发生这种情况的类的代码,将会非常有帮助。

java.lang.NoSuchMethodError

一般来说,这意味着 jar 已就位,类也已就位,但方法尚未就位。当您使用一个版本的 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我从 Eclipse 运行它并在 Maven 中使用一个依赖项,那么一切都很好:

<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.2.0</version>
Run Code Online (Sandbox Code Playgroud)

然后我用javajavac来做

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 
Run Code Online (Sandbox Code Playgroud)

请注意,我添加的唯一东西是两个罐子。

然后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
Run Code Online (Sandbox Code Playgroud)

我在类路径中添加了一些所需的 jar 并运行它 - 它工作得很好。

干杯,尤金。