在 JMS 2.0 factory.createContext() 中抛出 AbstractMethodError
In JMS 2.0 factory.createContext() is throwing AbstractMethodError
我正在使用 ActiveMq 作为提供程序和 JMS 2.0 API。
第二行抛出 AbstractMethodError,如何解决?
1. ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
2. JMSContext context = factory.createContext();
3. context.createProducer().send(destination, msg);
Exception in thread "main" java.lang.AbstractMethodError: org.apache.activemq.ActiveMQConnectionFactory.createContext()Ljavax/jms/JMSContext;
at jms.advance.Sender.sendMessage(Sender.java:41)
at jms.advance.Sender.main(Sender.java:26)
我使用以下步骤创建的 destination 对象。
ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("SAMPLE_test_QUEUE");
下面是完整的代码片段。
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSRuntimeException;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Sender {
public String senderId;
private ConnectionFactory factory = null;
private Connection connection = null;
private Session session = null;
private Destination destination = null;
public static void main(String... arg) throws JMSException, InterruptedException{
Sender sender = new Sender("facebook");
int count = 1;
for(int i=0; i <= 100; i++, count++){
String msg = sender.senderId +": "+ "sending msg #" + count;
sender.sendMessage(sender.factory, sender.destination, msg);
Thread.sleep(3000);
}
}
public Sender(String senderid) throws JMSRuntimeException, JMSException {
this.senderId = senderid;
factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
connection = factory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("SAMPLE_test_QUEUE");
}
public void sendMessage(ConnectionFactory factory, Destination destination, String msg) throws JMSException{
try(JMSContext context = factory.createContext()){
context.createProducer().send(destination, msg);
}catch(JMSRuntimeException e)
{
System.out.println(e);
}
}
}
如果我没记错的话,activemq目前还不支持JMS2。 (他们的 JIRA 中的相关问题仍然未解决:https://issues.apache.org/jira/browse/AMQ-5383)
所以createContext()
方法不会产生预期的结果。但是您仍然可以使用方法 createConnection()
来完成这项工作,因为 JMS2 具有 JMS 1.1 向后兼容性。
我正在使用 ActiveMq 作为提供程序和 JMS 2.0 API。 第二行抛出 AbstractMethodError,如何解决?
1. ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
2. JMSContext context = factory.createContext();
3. context.createProducer().send(destination, msg);
Exception in thread "main" java.lang.AbstractMethodError: org.apache.activemq.ActiveMQConnectionFactory.createContext()Ljavax/jms/JMSContext;
at jms.advance.Sender.sendMessage(Sender.java:41)
at jms.advance.Sender.main(Sender.java:26)
我使用以下步骤创建的 destination 对象。
ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("SAMPLE_test_QUEUE");
下面是完整的代码片段。
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSRuntimeException;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Sender {
public String senderId;
private ConnectionFactory factory = null;
private Connection connection = null;
private Session session = null;
private Destination destination = null;
public static void main(String... arg) throws JMSException, InterruptedException{
Sender sender = new Sender("facebook");
int count = 1;
for(int i=0; i <= 100; i++, count++){
String msg = sender.senderId +": "+ "sending msg #" + count;
sender.sendMessage(sender.factory, sender.destination, msg);
Thread.sleep(3000);
}
}
public Sender(String senderid) throws JMSRuntimeException, JMSException {
this.senderId = senderid;
factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
connection = factory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("SAMPLE_test_QUEUE");
}
public void sendMessage(ConnectionFactory factory, Destination destination, String msg) throws JMSException{
try(JMSContext context = factory.createContext()){
context.createProducer().send(destination, msg);
}catch(JMSRuntimeException e)
{
System.out.println(e);
}
}
}
如果我没记错的话,activemq目前还不支持JMS2。 (他们的 JIRA 中的相关问题仍然未解决:https://issues.apache.org/jira/browse/AMQ-5383)
所以createContext()
方法不会产生预期的结果。但是您仍然可以使用方法 createConnection()
来完成这项工作,因为 JMS2 具有 JMS 1.1 向后兼容性。