出于某种原因,我无法创建持久消费者,从activemq中摄取消息。我研究过here和here,但使用最新版本(以及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...");
}
错误:
线程中的异常" main" 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>
答案 0 :(得分:0)
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。
答案 1 :(得分:0)
在尝试对onCompletion方法使用CompletionListener接口时,我也遇到了同样的问题(java.lang.AbstractMethodError)。我使用JMS 2.0 Jar和JDK7特定的qpid客户端Jars在qpid代理上发送消息。
要解决我的问题,我观察到的对于使用JMS2.0 Jars,我不得不切换到JDK 8特定的Qpid Jars,使用JDK 8来执行我的代码。