【问题标题】:Unable to access ActiveMQ using JMS based code and amqp 1.0无法使用基于 JMS 的代码和 amqp 1.0 访问 ActiveMQ
【发布时间】: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 (&gt;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 创建正确的实现。一旦我发现它没有,事情就变得容易了。

标签: java activemq amqp


【解决方案1】:

最好使用 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();
        }
    }
}

替换

 <dependency>
    <groupId>org.apache.qpid</groupId>
    <artifactId>qpid-amqp-1-0-client-jms</artifactId>
    <version>0.32</version>
</dependency>

通过

    <dependency>
        <groupId>org.apache.qpid</groupId>
        <artifactId>qpid-jms-client</artifactId>
        <version>0.9.0</version>
    </dependency>

在代理方面您需要添加:

 <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?transport.transformer=jms"/>

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

【讨论】:

  • 我是否遗漏了什么 - 看起来您是在说用自己替换 jms 客户端...
  • 此代码有效,但我有点担心它可能使用的是旧版本的 AMQP 规范。我承认我不知道该怎么说,除了有 qpid-amqp-1-0-client 库可用。
  • Qpid JMS 是使用 Qpid Proton 构建的完整 AMQP 1.0 Java 消息服务 1.1 客户端。 qpid.apache.org/components/jms/index.html
  • Qpid JMS (AMQP 1.0) ^ qpid-amqp-1-0-client-jms-0.32-bin.tar.gz ASC、MD5、SHA1 我们建议您尝试我们更新的 Qpid JMS AMQP 1.0 客户端。 qpid.apache.org/releases/qpid-0.32
猜你喜欢
  • 2021-08-18
  • 2021-05-27
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多