无法使用基于JMS的代码和amqp 1.0访问ActiveMQ

我正在尝试使用AMQP 1.0连接到ActiveMQ代理,但我想在我的应用程序代码中使用JMS。 我对使用JMS感兴趣主要是因为我希望开发人员能够使用他们已经熟悉的API。

我在localhost上运行ActiveMQ 5.14.0,代码如下:

public static void main(String[] args) throws JMSException, InterruptedException { Connection connection = null; try { // Producer ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("amqp://localhost:5672"); connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("customerTopic"); // Publish MessageProducer producer = session.createProducer(topic); for ( int i = 0; i < 10; i++) { Message msg = session.createTextMessage("Task : " + i); producer.send(msg); } session.close(); } finally { if (connection != null) { connection.close(); } } } 

代码始终以相同的方式失败,并在stacktrace中具有以下根本原因:

Caused by: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://127.0.0.1:5672

这发生在connection.start()方法调用上。

如果我针对ActiveMQ tcp端点运行相同的代码,那么它将按预期执行。

我的pom文件依赖关系如下(我怀疑这是我的问题的根源,因为我发现依赖关系的文档非常难以遵循)

   org.apache.qpid qpid-amqp-1-0-client-jms 0.32   org.apache.activemq activemq-amqp 5.14.0   

我当前的问题是“为什么这不起作用?”。

我的补充(基于意见的)问题是“尝试在AMQP 1.0之上使用JMS抽象是否值得,或者我应该放弃自己学习提供者特定的API?”

与jndi合作更好

 public static void main(String[] args) throws JMSException, InterruptedException, NamingException { Connection connection = null; try { Properties props = new Properties(); props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.jms.jndi.JmsInitialContextFactory"); props.setProperty("connectionfactory.myFactoryLookup", "amqp://localhost:5672"); props.put("topic." + "MyTOPIC", "customerTopic"); InitialContext ic = new InitialContext(props); ConnectionFactory cf1 = (ConnectionFactory) ic.lookup("myFactoryLookup"); Topic topic = (Topic) ic.lookup("MyTOPIC"); connection = cf1.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(topic); connection.start(); for (int i = 0; i < 10; i++) { Message msg = session.createTextMessage("Task : " + i); producer.send(msg); } session.close(); } finally { if (connection != null) { connection.close(); } } } 

更换

   org.apache.qpid qpid-amqp-1-0-client-jms 0.32  

通过

   org.apache.qpid qpid-jms-client 0.9.0  

在经纪人方面,您需要添加:

   

参考http://activemq.apache.org/amqp.html