当我尝试调用org.apache.activemq.ActiveMQSession.createDurableConsumer时,为什么会出现java.lang.AbstractMethodError的错误?

3

由于某些原因,我无法创建一个持久化的消费者来从activemq中获取消息。我已经在这里这里进行了研究,但是使用最新版本(以及Java 1.7)并没有解决问题。我一定是在使用某个版本/实现上出错了,但我还没有找到根本原因。这是代码:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;

ConnectionFactory cf = new ActiveMQConnectionFactory("bob", "bobsPword", "tcp://localhost:61616");
Connection connection = cf.createConnection();
connection.start();
Session session = connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("TEST.QUEUE.FOO");
MessageConsumer consumer = session.createDurableConsumer(topic, "clientId");
Message message = consumer.receiveNoWait();
if (message instanceof TextMessage) {
    System.out.println("message: " + ((TextMessage) message).getText());
}else{
    System.out.println("unexpected message...");
}

错误信息:

主线程异常: java.lang.AbstractMethodError: org.apache.activemq.ActiveMQSession.createDurableConsumer(Ljavax/jms/Topic;Ljava/lang/String;)Ljavax/jms/MessageConsumer;

我的依赖项:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.jms</groupId>
        <artifactId>javax.jms-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>org.fusesource.stompjms</groupId>
        <artifactId>stompjms-client</artifactId>
        <version>1.19</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
        <version>5.10.0</version>
    </dependency>
</dependencies>

你可能在编译时和运行时使用了不同的JAR包。尝试从出现错误的代码中打印类路径,你可能会发现一些意外的东西。 - StephaneM
2个回答

2

activemq-client v. 5.10使用jms 1.1.x。Maven会自动加载以下依赖项:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-jms_1.1_spec</artifactId>
    <version>1.1.1</version>
</dependency>

创建持久性消费者是JMS 2.0的新功能。因此,调用javax.jms.Session.createDurableSubscriber(Topic topic, String name);会抛出java.lang.AbstractMethodError异常。


0

我在尝试使用CompletionListener接口的onCompletion方法时,也遇到了相同类型的问题(java.lang.AbstractMethodError)。我正在使用JMS 2.0 Jar和特定于JDK7的qpid客户端Jar将消息放置在qpid代理上。

为了解决我的问题,我观察到,要使用JMS2.0 Jars,我必须切换到特定于JDK8的Qpid Jars,并使用JDK8来执行我的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接