iOS RabbitMQ之AMQP相关

在ViewController文件里包含头文件,#import <RMQClient/RMQClient.h>

1. 接收方法

amqp://<user>:<pass>@<ip>:5672
amqp://user:pass@host:port

- (void)receive
{
    RMQConnection * conn = [[RMQConnection alloc] initWithUri:@"amqps://user:pass@yourHost:yourPort" delegate:[RMQConnectionDelegateLogger new]];
    [conn start];
    id<RMQChannel>channel = [conn createChannel];
    RMQQueue * queue = [channel queue:@"test"];
    [queue subscribe:^(RMQMessage * _Nonnull message) {
        NSLog(@"message:%@",[[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding]);
    }];  
}

写完上面的代码后运行报错

Received connection: <RMQConnection: 0x282826180> disconnectedWithError: Error Domain=kCFStreamErrorDomainSSL Code=-9847 "(null)" UserInfo={NSLocalizedRecoverySuggestion=Error code definition can be found in Apple's SecureTransport.h}

在网上一番查找也没找到解决办法,似乎这个和证书有关,后台同事说并没有用证书,看我的Uri是amqps开头说不应该用amqps,那个s需要去掉,去掉s后运行果然不报上面的错误了(但内心还是懵懵的 ps:amqps不是对应https, ampq对应http吗,不理解)

如果手动添加RMQClient,不要忘了添加下图的另外两个:


image.png

可能会出现#import <>报错:将#import <>的对应改成#import ""

按照上面写的但是收不到消息,故而加了个RMQExchange

RMQConnection * conn = [[RMQConnection alloc] initWithUri:@"amqp://user:pass@yourHost:yourPort" delegate:[RMQConnectionDelegateLogger new]];
    [conn start];
    id<RMQChannel>channel = [conn createChannel];
    RMQExchange *exchange = [channel direct:@"xxx.server" options:RMQExchangeDeclareDurable];
    RMQQueue * queue = [channel queue:@"test"];
    [queue bind:exchange];
    [queue subscribe:^(RMQMessage * _Nonnull message) {
        NSLog(@"message:%@",[[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding]);
    }];

然而还是接收不到消息
后来发现是没绑定routingKey(据说RMQExchange一定要有routingKey)加上routingKey后可以接收到消息了,代码如下:

RMQConnection * conn = [[RMQConnection alloc] initWithUri:@"amqp://user:pass@yourHost:yourPort" delegate:[RMQConnectionDelegateLogger new]];
    [conn start];
    id<RMQChannel>channel = [conn createChannel];
    // 这里使用的direct模式
    RMQExchange *exchange = [channel direct:@"xxx.server" options:RMQExchangeDeclareDurable];
    // 后台说 queue名和routingKey定义成一样的(queue名是为了方便区分定义,本人并不是很明白)
    NSString *routingKey = @"test";
    RMQQueue * queue = [channel queue:routingKey];
    [queue bind:exchange routingKey:routingKey];
    [queue subscribe:^(RMQMessage * _Nonnull message) {
        NSLog(@"message:%@",[[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding]);
    }];

/// 关闭RMQ

- (void)closeRMQ{
    if (self.conn) {
        NSString *routingKey =  @"test";
        if (account.length != 0) {
            // 队列解绑
            [self.queue unbind:self.exchange routingKey:routingKey];
            // 队列删除 !!!!这句很重要(不写后台网页上的队列一直存在,导致其他手机无法正常接收消息)
            [self.queue delete];
            // 关闭通道
            [self.channel close];
            self.channel = nil;
            // 断开连接
            [self.conn close];
            self.conn = nil;
        }
    }
}

Queued Messages: 正在排队等待消费的消息
Ready:待消费的消息总数。
Unacked:待应答的消息总数。
Total:总数 Ready+Unacked
MessageRates :
publish:producter pub消息的速率。
deliver:consumer 获取消息的速率。
acknowledge:consumer ack消息的速率。

关于RMQExchange:

交换机:
1.用于接收客户端投递过来的消息
2.分发消息到指定的队列

目前共四种类型:direct、fanout、topic、headers(headers匹配AMQP消息的header而不是路由键(Routing-key),此外headers交换器和direct交换器完全一致,但是性能差了很多,目前几乎用不到了。所以直接看另外三种类型)
direct:直连
topic:路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它同样也会识别两个通配符:"#"和" * "。#匹配0个或多个单词," * "匹配不多不少一个单词。(生产端发送了三条消息,消费端只能接收到routingKey为user.save、user.update的这两条消息,因为bindingKey = "user.* ",“ * ”只能匹配到一个字符。如果此时换成“#”,那这三条消息都能接收到。)
fanout:属于广播模式,意思就是消息不走任何的路由规则,只有队列和交换机有绑定关系就能收到消息。(生产者发送了5条消息,消费者1、2 分别都收到了5条消息。)

最后,交换机的属性整理一下
Name: 交换机名称
Type: 交换机类型,direct、topic、 fanout、 headers
Durability: 是否需要持久化
Auto Delete: 当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange
Internal: 当前Exchange是否用于RabbitMQ内部使用,默认为False
Arguments: 扩展参数,用于扩展AMQP协议定制化使用
exchange相关解释参考自:https://www.jianshu.com/p/edbd76af74cf

以上就是敲代码的心得啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容