2014-07-10 315 views
1

由於某些原因,我無法創建持久使用者以從activemq中接收消息。我研究了herehere,但使用最新版本(以及Java 1.7)尚未解決問題。我必須使用錯誤的版本/實現某些東西,但我一直無法將其解決。下面是代碼:當我嘗試調用org.apache.activemq.ActiveMQSession.createDurableConsumer時,爲什麼會收到java.lang.AbstractMethodError

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..."); 
} 

錯誤:

Exception in thread "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

您可能在編譯時和運行時使用不同的jar。嘗試從出現錯誤的代碼中打印類路徑,您可能會遇到令人驚訝的事情。 – StephaneM

回答

0

的ActiveMQ的客戶端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

在嘗試爲onCompletion方法使用CompletionListener接口時,我也遇到了同樣的問題(java.lang.AbstractMethodError)。我正在使用JMS 2.0 Jar以及JDK7特定的qpid客戶端Jars在qpid broker上放置消息。

爲了解決我的問題,我觀察到爲了使用JMS2.0 Jars,我不得不切換到JDK 8特定的Qpid Jars,使用JDK 8來執行我的代碼。

相關問題