Jli*_*lia 5 objective-c amqp rabbitmq ios
我正在尝试使用RabbitMQ for iOS制作消息传递应用程序.我正在使用RabbitMQ-C客户端库的目标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;
}
Run Code Online (Sandbox Code Playgroud)
我搜索了分配,因为我也实现了这种类型的应用程序,在许多地方我发现库在使用iPhone应用程序时有许多类型的错误.我知道你已经解决了你的问题,但这个答案适用于那些仍在受苦的人.我将rabbitmq-c和obejective-c包装器的库结合起来,擦除问题并将其存储在我自己的位置.在给定链接的情况下,您可以使用rabbitmq-lib进行Objective-C开发.
https://dl.dropboxusercontent.com/u/75870052/AMQPLib.zip
包括这个库,导入文件如下: -
#import "AMQPExchange.h"
#import "AMQPConsumer.h"
#import "AMQPConnection.h"
#import "AMQPConsumerThread.h"
#import "AMQPChannel.h"
#import "AMQPQueue.h"
#import "AMQPMessage.h"
Run Code Online (Sandbox Code Playgroud)
定义您的凭据,我使用了默认值.
#define host @"localhost"
#define routingQueue @"CreateQueue"
#define port 5672
#define user @"guest"
#define pass @"guest"
Run Code Online (Sandbox Code Playgroud)
用于在服务器上发布消息使用以下方法.
- (IBAction)send:(id)sender {
NSError *error= nil;
NSError *error2 = nil;
NSError *error3 = nil;
NSError *error4 = nil;
AMQPConnection *connection = [[AMQPConnection alloc] init];
[connection connectToHost:host onPort:port error:&error];
if (error != nil){
NSLog(@"Error connection: %@", error);
return;
}
[connection loginAsUser:user withPasswort:pass onVHost:@"/" error:&error];
if (error != nil){
NSLog(@"Error logined: %@", error);
return;
}
AMQPChannel *channel = [connection openChannelError:&error2];
AMQPExchange *exchange = [[AMQPExchange alloc] initDirectExchangeWithName:@"AMQP" onChannel:channel isPassive:NO isDurable:NO getsAutoDeleted:NO error:&error];
if (error != nil){
NSLog(@"Error declareExchange: %@", error);
return;
}
AMQPQueue *queue = [[AMQPQueue alloc] initWithName:routingQueue onChannel:channel error:&error3];
if (error != nil){
NSLog(@"Error declare Queue: %@", error);
return;
}
BOOL success = [queue bindToExchange:exchange withKey:routingQueue error:&error4];
if (success) {
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;
//Here put your message to publish...
[exchange publishMessage:@"YOUR MESSAGE" usingRoutingKey:routingQueue propertiesMessage:props mandatory:NO immediate:NO error:&error];
if (error != nil){
NSLog(@"Error declareExchange: %@", error);
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
要接收消息,您需要委托.
-(IBAction)receiveMessage:(id)sender
{
NSError *error= nil;
NSError *error2 = nil;
NSError *error3 = nil;
NSError *error4 = nil;
AMQPConnection *connection = [[AMQPConnection alloc] init];
[connection connectToHost:host onPort:port error:&error];
[connection loginAsUser:user withPasswort:pass onVHost:@"/" error:&error];
AMQPChannel *channel = [connection openChannelError:&error2];
AMQPQueue *queue = [[AMQPQueue alloc] initWithName:routingQueue onChannel:channel isPassive:NO isExclusive:NO isDurable:NO getsAutoDeleted:NO error:&error3];
AMQPConsumer *consumer = [[AMQPConsumer alloc] initForQueue:queue onChannel:&channel useAcknowledgements:YES isExclusive:NO receiveLocalMessages:NO error:&error4 deepLoop:1];
AMQPConsumerThread *consumerThread = [[AMQPConsumerThread alloc] initWithConsumer:consumer delegate:self nameThread:@"myThread" persistentListen:NO];
consumerThread.delegate=self;
[consumerThread start];
}
-(void)amqpConsumerThreadReceivedNewMessage:(AMQPMessage *)theMessage
{
NSLog(@"message = %@", theMessage.body);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3483 次 |
| 最近记录: |