无法使用Node.js连接到Apache ActiveMQ

时间:2017-05-09 15:04:10

标签: node.js activemq amqp

背景

尝试通过amqp10使用AMQP 1.0协议连接到我的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(buffer,callback);           ^

     

TypeError:无法读取属性&#39>写'为null       at 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)       在Socket。 (/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拒绝该请求为无效。

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

2 个答案:

答案 0 :(得分:4)

解决方案

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

  

从5.14开始(...)ActiveMQ需要SASL层,即使您使用   ANONYMOUS进行身份验证。客户的例子通常不会   以任何方式明确地进行身份验证(...)

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

选项1 - 更改代码

第一个是更改代码,这就是我想要的:

  

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

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

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

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

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

答案 1 :(得分:3)

最可能的问题是客户端没有在连接上使用基于SASL的身份验证请求,而只是尝试直接连接。代理默认要求客户端在其打开握手时使用SASL,即使身份验证机制仅仅是匿名'匿名'这样客户端就可以针对任何现有的代理安全策略进行验证。

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

了解代理商配置here