【发布时间】:2017-01-24 11:54:25
【问题描述】:
我正在尝试使用 AMQP 1.0 连接到 ActiveMQ 代理,但我想在我的应用程序代码中使用 JMS。我对使用 JMS 感兴趣主要是因为我希望开发人员能够使用他们已经熟悉的 API。
我在本地主机上运行 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();
}
}
}
代码总是以同样的方式失败,堆栈跟踪中的根本原因如下:
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 文件依赖项如下(我怀疑这是我的问题的根源,因为我发现依赖项的文档非常难以遵循)
<dependencies>
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-amqp-1-0-client-jms</artifactId>
<version>0.32</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-amqp</artifactId>
<version>5.14.0</version>
</dependency>
</dependencies>
我的直接问题是“为什么这不起作用?”。
我的补充(基于意见)问题是“是否值得尝试使用 AMQP 1.0 以上的 JMS 抽象,还是应该放弃自己去学习提供者特定的 API?”
【问题讨论】:
-
希望上面的代码 sn-p 是错误的,您似乎正在使用 ActiveMQ 本机客户端尝试连接到 AMQP transportConnector 地址,因为本机客户端使用 OpenWire 作为其协议,因此该地址将永远无法工作.
-
@tim bish :我认为这在很多层面上都是错误的 :)。我现在通过更新我的依赖项和更改连接工厂的创建方式来让它工作。似乎我期待(希望)ActiveMQConnectionFactory 会根据我传递给构造函数的 URL 创建正确的实现。一旦我发现它没有,事情就变得容易了。