我正在使用RabbitMQ 2.8.7 DotNet Client和WSO2 MB 3.2.1。 我的部署环境是Win7 R1 64位或Win Server 08 R2 64位。 我遇到了与Exchange的多个连接的问题,因此流式传输到多个消费者的数据会在间歇性时间丢失。我们已尝试将WSO2 MB更新为3.2.3&将我们的交换更改为扇出来解决这种连接丢失问题,但遇到了问题。
这个链接有点相关会“显得”:
我首先想知道这是否是正确的方法。
其次,我想通过使用扇出来了解我们在运行时收到的当前错误,因为我们无法访问数据。以下是收到的错误,WSO2 MB日志输出&来自制作人的代码片段。
如果需要更多信息,请告知。
收到错误...
"Unhandled Exception:
RabbitMQ.Client.Exceptions.OperationInterruptedException: The AMQP operation
was interrupted: AMQP close-reason, initiated by Peer, code=504, text="org.apache.qpid.AMQSecurityException: Permission denied: binding
[error code 403: access refused]", classId=50, methodId=20, cause=
at RabbitMQ.Client.Impl.SimpleBlockingRpcContinuation.GetReply()
at RabbitMQ.Client.Impl.ModelBase.ModelRpc(MethodBase method, ContentHeaderBase header, Byte[] body)
at RabbitMQ.Client.Framing.Impl.v0_9_1.Model._Private_QueueBind(String queue,
String exchange, String routingKey, Boolean nowait, IDictionary arguments)
at RabbitMQ.Client.Impl.ModelBase.QueueBind(String queue, String exchange, String routingKey, IDictionary arguments)
at RabbitMQ.Client.Impl.ModelBase.QueueBind(String queue, String exchange, String routingKey)
at Send.Main()
记录@错误时间......
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,042] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 0, bodyFrame: [ConnectionStartOkBodyImpl: clientProperties={platform=[LONG_STRING: .NET], product=[LONG_STRING: RabbitMQ], capabilities=[FIELD_TABLE: {publisher_confirms=[BOOLEAN: true], exchange_exchange_bindings=[BOOLEAN: true], consumer_cancel_notify=[BOOLEAN: true], basic.nack=[BOOLEAN: true]}], copyright=[LONG_STRING: Copyright (C) 2007-2012 VMware, Inc.], information=[LONG_STRING: Licensed under the MPL. See http://www.rabbitmq.com/], (http://www.rabbitmq.com/%5D,) version=[LONG_STRING: 0.0.0.0]}, mechanism=PLAIN, response=[0, 115, 118, 99, 46, 114, 105, 46, 97, 116, 99, 0, 112, 97, 115, 115, 119, 111, 114, 100], locale=en_US]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,042] INFO {org.apache.qpid.server.handler.ConnectionStartOkMethodHandler} - SASL Mechanism selected: PLAIN
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,042] INFO {org.apache.qpid.server.handler.ConnectionStartOkMethodHandler} - Locale selected: en_US
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,681] INFO {org.apache.qpid.server.handler.ConnectionStartOkMethodHandler} - Connected as: svc.abc.def
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,681] INFO {org.apache.qpid.server.handler.ConnectionStartOkMethodHandler} - Framesize set to 65535
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,681] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 0, bodyFrame: [ConnectionTuneOkBodyImpl: channelMax=256, frameMax=65535, heartbeat=0]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,681] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 0, bodyFrame: [ConnectionOpenBodyImpl: virtualHost=carbon, capabilities=null, insist=false]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,697] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 1, bodyFrame: [ChannelOpenBodyImpl: outOfBand=null]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,697] INFO {org.apache.qpid.server.handler.ChannelOpenHandler} - Connecting to: carbon
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,697] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 1, bodyFrame: [QueueDeclareBodyImpl: ticket=0, queue=fanout, passive=false, durable=false, exclusive=false, autoDelete=false, nowait=false, arguments=null]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,759] INFO {org.apache.qpid.server.handler.QueueDeclareHandler} - Queue fanout bound to default exchange(<<default>>)
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,759] INFO {org.apache.qpid.server.handler.QueueDeclareHandler} - Queue fanout declared successfully
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,759] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 1, bodyFrame: [QueueBindBodyImpl: ticket=0, queue=fanout, exchange=fanout, routingKey=null, nowait=false, arguments=null]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,759] INFO {org.apache.qpid.server.protocol.AMQProtocolEngine} - Closing channel due to: org.apache.qpid.AMQSecurityException: Permission denied: binding [error code 403: access refused]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,759] INFO {org.apache.qpid.server.AMQChannel} - No consumers to unsubscribe on channel [/192.168.1.14:56087(svc.abc.def):1]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,775] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 1, bodyFrame: [ChannelCloseOkBodyImpl: ]
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,775] INFO {org.apache.qpid.server.protocol.AMQProtocolEngine} - Channel[1] awaiting closure - processing close-ok
INFO | jvm 1 | 2013/03/01 11:29:27 | [2013-03-01 11:29:27,775] INFO {org.apache.qpid.server.handler.ChannelCloseOkHandler} - Received channel-close-ok for channel-id 1
INFO | jvm 1 | 2013/03/01 11:29:29 | [2013-03-01 11:29:29,070] DEBUG {org.apache.qpid.server.protocol.AMQProtocolEngine} - Frame Received: Frame channelId: 0, bodyFrame: [ConnectionCloseBodyImpl: replyCode=200, replyText=Connection close forced, classId=0, methodId=0]
INFO | jvm 1 | 2013/03/01 11:29:29 | [2013-03-01 11:29:29,070] INFO {org.apache.qpid.server.handler.ConnectionCloseMethodHandler} - ConnectionClose received with reply code/reply text 200/Connection close forced for /192.168.1.14:56087(svc.abc.def)
我发现在尝试连接Java时也会出现此问题。 生产者的C#代码的简短示例如下:
class Send {
public static void Main() {
string serverAddress = "amqp://" + "192.168.1.12" + ":5672/carbon";
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = serverAddress;
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel()) {
channel.QueueDeclare("fanout", false, false, false, null);
channel.QueueBind("fanout", "fanout", "");
string message = "Hello World!";
byte[] body = System.Text.Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "hello", null, body);
Console.WriteLine(" [x] Sent {0}", message);
}
}
}
答案 0 :(得分:1)
在WSO2 MB中,不会为给定的任何名称动态创建交换。因此,要使用'扇出'交换进行此操作,需要在qpid-virtualhosts.xml文件中预先声明。否则使用WSO2 MB的默认交换。
您似乎没有正确声明队列需要绑定的交换名称。如果它是队列,默认的交换名称声明就像,
ch.ExchangeDeclare("amq.direct", "direct");
如果是主题,那么
ch.ExchangeDeclare("amq.topic", "topic");
请参阅this博文,了解如何使用带有WSO2 Message Broker的.Net / C#Consumer / Publisher客户端示例。