【问题标题】:Unable to connect to Apache ActiveMQ with Node.js无法使用 Node.js 连接到 Apache ActiveMQ
【发布时间】:2017-10-07 23:25:48
【问题描述】:

背景

尝试使用 AMQP 1.0 协议通过 amqp10 连接到我的 Apache ActiveMQ 代理。我正在使用以下代码(改编自 README 中的原始示例):

const AMQPClient = require("amqp10").Client;
const Promise = require("bluebird");

//Fix from: https://github.com/noodlefrenzy/node-amqp10/issues/241
const activeMQPolicy = require("amqp10").Policy;
const client = new AMQPClient(activeMQPolicy.ActiveMQ);

const setUp = () => {
    return Promise.all([
        client.createReceiver("amq.topic"),
        client.createSender("amq.topic")
    ]);
};

client.connect("amqp://localhost")
    .then(setUp)
    .spread(function (receiver, sender) {
        receiver.on("errorReceived", function (err) {

            if (err) {
                console.log(`failed with error: ${err}`);
                return;
            }

            receiver.on("message", message => console.log(`Rx message: ${message.body}`));

            return sender.send({ key: "Value" });
        });
    })
    .error( err => console.log("error: ", err));

错误

执行失败并出现以下应用程序错误:

工作区/activemq/node_modules/amqp10/lib/frames.js:64 stream.write(缓冲区,回调); ^

TypeError:无法读取 null 的属性“写入” 在 Object.frames.writeFrame (/home/pedro/Workspace/activemq/node_modules/amqp10/lib/frames.js:64:9) 在 Connection.sendFrame (/home/pedro/Workspace/activemq/node_modules/amqp10/lib/connection.js:329:10) 在 Connection._sendCloseFrame (/home/pedro/Workspace/activemq/node_modules/amqp10/lib/connection.js:491:8) 在 Connection._receiveAny (/home/pedro/Workspace/activemq/node_modules/amqp10/lib/connection.js:413:12) 在 Connection._receiveData (/home/pedro/Workspace/activemq/node_modules/amqp10/lib/connection.js:358:8) 在 NetTransport。 (/home/pedro/Workspace/activemq/node_modules/amqp10/lib/connection.js:516:38) 在 emitOne (events.js:96:13) 在 NetTransport.emit (events.js:191:7) 在套接字。 (/home/pedro/Workspace/activemq/node_modules/amqp10/lib/transport/net_transport.js:26:49) 在 emitOne (events.js:96:13) 在 Socket.emit (events.js:191:7) 在 readableAddChunk (_stream_readable.js:178:18) 在 Socket.Readable.push (_stream_readable.js:136:10) 在 TCP.onread (net.js:560:20)

虽然 ActiveMQ 拒绝请求并显示以下消息:

警告 |来自非 AMQP v1.0 客户端的连接尝试。 AMQP,0,1,0,0 警告 |传输连接到:tcp://127.0.0.1:53188 失败:org.apache.activemq.transport.amqp.AmqpProtocolException:尝试使用不受支持的 AMQP 来自客户端的连接

我尝试了什么

我尝试实施此问题中描述的修复:

但它也没有工作。还尝试在 url 中指定端口 5672,但没有成功。

问题

此时我很确定应用程序写入失败,因为 ActiveMQ 将请求视为无效而拒绝。

  • 关于如何解决此问题的任何想法?

【问题讨论】:

    标签: node.js activemq amqp


    【解决方案1】:

    解决方案

    在 ActiveMQ 论坛中四处询问后,事实证明@Tim 是正确的。引用用户 Gordon Sim-2 的话:

    从 5.14 (...) ActiveMQ 需要一个 SASL 层,即使您使用 匿名进行身份验证。客户的示例通常不会 以任何方式显式验证 (...)

    要解决此问题,有两种选择。

    选项 1 - 更改代码

    第一个是改代码,就是我要找的:

    要让 amqp10 客户端使用 SASL 层,只需指定一个 连接上的 saslMechanism 覆盖,例如

    client.connect(uri, {'saslMechanism':'ANONYMOUS'})
    

    这种方法是由另一个名为 rhea 的 AMQP 1.0 Node.js 库的创建者提出的,我强烈建议您在阅读本文时进行检查。

    选项 2 - 更改代理配置文件

    第二个,正如 Tim 所建议的,是更改代理配置文件。如果您选择这种方法,我建议您阅读他的帖子,因为它更完整。

    【讨论】:

    • 无论如何,我看不出您可以在哪里修改 AmazonMQ 实例中的 TransportConnector。我阅读了supported config elements 的列表,但我没有在其中看到它。感谢您找到客户端修复程序。
    【解决方案2】:

    最可能的问题是客户端在连接时没有使用基于 SASL 的身份验证请求,而只是尝试直接连接。代理默认要求客户端在其打开握手中使用 SASL,即使身份验证机制只是“匿名”,以便可以根据任何现有的代理安全策略验证客户端。

    您可以通过将 wireFormat.allowNonSaslConnections=true 添加到代理的 AMQP TransportConnector 配置来禁用此检查,然后查看您是否可以连接。这可能是一个短期解决方案,但在生产代理上,您不应该使用该选项,并且应该有一个有效的安全策略和用户/密码身份验证。

    阅读代理配置here

    【讨论】:

    • 如何编辑我的代码以反映您的建议?
    • 此选项在您的代理配置中。
    • 如果有activemq,那会在哪里?
    • 在您应该阅读的 ActiveMQ 文档中解释的 activemq.xml 中。
    猜你喜欢
    • 2013-08-21
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多