Клиент Objective-C RabbitMQ не публикует сообщения в очереди

Я пытаюсь создать приложение для обмена сообщениями, используя RabbitMQ для iOS. и я использую классы-оболочки для цели c, с клиентскими библиотеками RabbitMQ-C.

https://github.com/profmaad/librabbitmq-objc

Exchange, Queue & Queue Binding все в порядке, но мой код не публикует сообщение на сервере 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;
    }

1 ответ

Решение

Я искал много, так как я тоже реализую этот тип приложения, во многих местах я нашел библиотеку, в которой есть много типов ошибок при реализации с помощью приложения для 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"

Определите свои учетные данные, я использовал по умолчанию.

#define host @"localhost"
#define routingQueue @"CreateQueue"
#define port 5672
#define user @"guest"
#define pass @"guest"

Для публикации сообщения на сервере используйте следующий метод.

- (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;
        }
    }
}

Для получения сообщения вам необходим делегат.

-(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);
}
Другие вопросы по тегам