将AMQP 0-9-1与WSO2 MB一起使用时权限被拒绝
尝试使用AMQP 0-9-1与WSO2 MB通信时,我收到来自WSO2 MB的安第斯核心的“权限被拒绝”AMQSecurityException。这是因为我试图使用路由键将队列绑定到主题。任何人都可以提供关于如何使用带有WSO2 MB的AMQP 0-9-1库的指导吗 具体地说,我的代码试图使用路由键“rkey”发布到exchange“texch”,并通过运行时创建的队列使用消息,该队列绑定到使用路由键“rkey”的“texch” WSO2 MB的输出为:将AMQP 0-9-1与WSO2 MB一起使用时权限被拒绝,wso2,amqp,Wso2,Amqp,尝试使用AMQP 0-9-1与WSO2 MB通信时,我收到来自WSO2 MB的安第斯核心的“权限被拒绝”AMQSecurityException。这是因为我试图使用路由键将队列绑定到主题。任何人都可以提供关于如何使用带有WSO2 MB的AMQP 0-9-1库的指导吗 具体地说,我的代码试图使用路由键“rkey”发布到exchange“texch”,并通过运行时创建的队列使用消息,该队列绑定到使用路由键“rkey”的“texch” WSO2 MB的输出为: [2013-04-02 14:27:34
[2013-04-02 14:27:34,012] INFO {org.wso2.andes.server.protocol.AMQProtocolEngine} - Closing channel due to: org.wso2.andes.AMQSecurityException: Permission denied: binding rkey [error code 403: access refused]
[2013-04-02 14:27:34,015] INFO {org.wso2.andes.server.protocol.AMQProtocolEngine} - Channel[1] awaiting closure - processing close-ok
[2013-04-02 14:27:34,015] INFO {org.wso2.andes.server.handler.ChannelCloseOkHandler} - Received channel-close-ok for channel-id 1
[2013-04-02 14:27:36,424] INFO {org.wso2.andes.server.store.CassandraMessageStore} - Removed Global Queue Assigned for Topic Subscription: tmp_1792d33b-7975-44db-b68f-dc54ce9a0852
在WSO2 Message Broker中,不会为给定的任何名称动态创建交换。因此,如果它用于主题,我们需要使用“amq.topic”,预定义的默认主题交换名称WSO2 MB作为交换名称,如果它用于队列,则默认交换需要为“amq.direct”,以避免此权限问题
此外,如果需要创建新的主题/直接交换(在您的示例中为“texch”),则需要在qpid-virtualhosts.xml文件中预先声明它,然后您可以将队列/主题绑定到新的交换中。有关这方面的更多指南,请参阅博客文章 我们必须如下配置quid-virtualhost.xml文件,以便在服务器启动时创建Q
<!-- Here you can add remove exchange to this virtualhost-->
<exchange>
<type>direct</type>
<name>carbon.direct</name>
<durable>true</durable>
</exchange>
<exchange>
<type>topic</type>
<name>carbon.topic</name>
</exchange>
</exchanges>
<queues>
<queue>
<name>TEST</name>
<TEST>
<exchange>carbon.direct</exchange>
<durable>true</durable>
</TEST>
</queue>
更多参考
var amqp = require("amqp-ts");
var connection = new amqp.Connection("amqp://admin:admin@localhost:5672");
//var exchange = connection.declareExchange("carbon.direct",{noCreate: true});
var queue = connection.declareQueue("TEST",{noCreate: true});
//queue.bind(exchange);
queue.activateConsumer((message) => {
console.log("Message received: " + message.getContent());
});
// it is possible that the following message is not received because
// it can be sent before the queue, binding or consumer exist
var msg = new amqp.Message("Test");
queue.send(msg);
connection.completeConfiguration().then(() => {
// the following message will be received because
// everything you defined earlier for this connection now exists
var msg2 = new amqp.Message("Test2");
queue.send(msg2);
});