【发布时间】:2014-07-17 04:58:42
【问题描述】:
我正在尝试使用 RabbitMQ for iOS 制作消息传递应用程序。 我正在将此包装类用于目标 c,并带有 RabbitMQ-C 客户端库。
https://github.com/profmaad/librabbitmq-objc
Exchange、队列和队列绑定一切正常,但我的代码没有将消息发布到 RabbitMQ 服务器。请帮帮我,什么问题?
这是我的代码:
NSError *error= nil;
AMQPConnection *connection = [[AMQPConnection alloc] init];
[connection connectToHost:@"SERVER_NAME" onPort:PORT error:&error];
if (error != nil){
NSLog(@"Error connection: %@", error);
return;
}
[connection loginAsUser:@"USER_NAME" withPasswort:@"PASSWORD" onVHost:@"/" error:&error];
if (error != nil){
NSLog(@"Error logined: %@", error);
return;
}
AMQPChannel *channel = [connection openChannel];
AMQPExchange *exchange = [[AMQPExchange alloc] initFanoutExchangeWithName:@"EXCHANGE_NAME" onChannel:channel isPassive:NO isDurable:NO getsAutoDeleted:NO error:&error];
if (error != nil){
NSLog(@"Error declareExchange: %@", error);
return;
}
//AMQPQueue *queue = [[AMQPQueue alloc] initWithName:@"NAME" onChannel:channel isPassive:NO isExclusive:NO isDurable:YES getsAutoDeleted:YES error:&error];
AMQPQueue *queue = [[AMQPQueue alloc] initWithName:@"NAME" onChannel:[connection openChannel]];
if (error != nil){
NSLog(@"Error declare Queue: %@", error);
return;
}
NSError *error ;
[queue bindToExchange:exchange withKey:@"KEY" error:&error];
amqp_basic_properties_t props;
props._flags= AMQP_BASIC_CLASS;
props.type = amqp_cstring_bytes([@"typeOfMessage" UTF8String]);
props.priority = 1;
[exchange publishMessage:@"Test message" usingRoutingKey:@"ROUTING_KEY" propertiesMessage:props mandatory:NO immediate:NO error:&error];
if (error != nil){
NSLog(@"Error declareExchange: %@", error);
return;
}
【问题讨论】:
-
您是否按预期声明了交换?您是否按预期声明了队列?绑定队列是否按预期进行交换?您是否将消息发布到适当的交易所?您的消息可以路由到预期的队列吗?您是否有一些消费者窃取了您的信息?应用程序是否抛出任何异常? RabbitMQ 日志中是否有任何可疑输出? - 这些问题通常会节省我的时间和神经元来寻找某些魔法发生的原因。
-
感谢 zaq178miami,我正在使用 EXCHANGE NAME = "fanout" ,BINDING KEY = "hello",ROUTING KEY = "hello" 和 QUEUE = "11111" 我也尝试过这个项目:github.com/leisurehuang/RabbitMQ-IOS-lib同样的问题。它在 RabbitMQ 服务器上制作所有内容,但不向队列发布任何消息。而且我没有运行消费者线程,xcode 也不例外。我很困惑这是服务器问题还是我遗漏了什么?
-
这些问题是为了帮助您调试原因。无论如何,尝试使用路由键等于队列名称发布到默认交换(具有空名称),这是将消息放入您想要的确切队列的快速而肮脏的方式。
-
zaq178miami ,我现在使用的方式与您建议的方式相同。并在 Xcode 中遇到一些异常。请建议我现在应该做什么?我是 RabbitMQ 的新手。异常:AMQPException:无法将队列绑定到交换:ACCESS_REFUSED - 在默认交换上不允许操作 AMQPException:无法发布消息:ACCESS_REFUSED - 在默认交换上不允许操作错误 declareExchange:错误域 = AMQPExchange 代码 = -10“失败发布消息:" UserInfo=0x8f41250 {NSLocalizedDescription=无法发布消息:}
-
我已经解决了。实际上
amqp_basic_properties_t props;有问题然后我尝试使用amqp_basic_properties_t props; props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG; props.content_type = amqp_cstring_bytes("text/plain"); props.delivery_mode = 2; props.priority = 1;它现在可以工作了。 @zaq178miami 和@old_sound 谢谢你的帮助。
标签: ios objective-c rabbitmq amqp