RabbitMQ-客户端开发向导

本文介绍了如何使用RabbitMQ建立连接,通过ConnectionFactory创建Connection和Channel。详细讲解了声明交换器、队列以及绑定操作,并讨论了生产者和消费者在声明资源时的注意事项。提到了消息的发送与消费,包括推模式和拉模式的消费,以及消费者端的消息确认和拒绝机制。最后,强调了资源管理和连接关闭的重要性。

(1)连接RabbitMQ

ConnectionFactory factory = new ConnectionFactory(); 
factory.setUsername(USERNAME); 
factory.setPassword(PASSWORD); 
factory.setVirtualHost(virtualHost); 
factory.setHost(IP ADDRESS); 
factory.setPort(PORT); 
Connection conn= factory.newConnection();

也可以选择使用URI的方式来实现,如代码清单3-2

ConnectionFactory factory =口ew ConnectionFactory(); 
factory.setUri (” amqp://userName : password@ipAddress:portNumber/virtualHost”); 
Connection conn= factory.newConnection(); 
Connection 接口被用来创建一个 Channel:
Channel channel= conn.createChannel();

注意:Connection可以用来创建多个Channel实例,但channel实例不能在线程间共享,应用程序应该为每一个线程开辟一个Channel。某些情况下channel的操作可以并行运行,但是在其它情况下会导致在网络上出现错误的通信帧交错,同事也会影响发送方确认。所以多线程间共享channel实例是非线程安全的。

(2)使用交换器和队列

channel.exchangeDeclare(exchangeName, ” direct”, true); 
String queueName = channel . queueDeclare() .getQueue(); 
channel.queueBind(queueName , exchangeName , routingKey);

上面创建了一个持久化的、非自动删除的、绑定类型为direct的交换器,同时创建了一个非持久化的、排他的、自动删除的队列。

生产者和消费者都可以声明一个交换器或者队列。如果尝试声明一个已经存在的交换器或者队列,只要声明的参数完全匹配现存的交换器或队列,rabbitMQ就可以声明都不做,并成功返回。如果声明的参数不匹配则会抛出异常。

1)exchangeDeclare方法:

2)queueDeclare方法

3)exchangeBind方法,

不仅可以将交换器与队列绑定,也可以将交换器与交换器绑定。

(5)何时创建

RabbitMQ的消息存储在队列中,交换器的使用并不真正耗费服务器的性能,而队列会。

如果要衡量RabbitMQ当前的QPS只需看队列的即可。在实际业务应用中,需要对所创建的队列的流量、内存占用及网卡占用有一个清晰的认可,预估其平均值和峰值,以便在固定硬件资源的情况下能够进行合理有效的分配。

生产者和消费者都应该尝试创建队列。也可以通过网页管理、RabbitMQ命令或者更好的是从配置中心下发。

如果在后期运行过程中超过预定的阈值,可以根据实际情况对当前集群进行扩容或者将相应的队列迁移到其他集群。迁移的过程也可以对业务程序完全透明。

如果集群资源充足,而即将使用的队列所占用的资源又在可控的范围之内,为了增加业务
程序的灵活性,也完全可以在业务程序中声明队列。
发送消息:
如果要发送一个消息,可以使用Channel类的basicPublish方法
消费消息:
RabbitMQ的消费模式分两种:推(push)模式和拉(pull)模式。推模式采用Basic.Consume进行消费,而拉模式则是调用Basic.Get进行消费。
(A)推模式
在推模式中,可以通过持续订阅的方式来消费消息,使用到的相关类有:
import com . rabbitmq.client .Consumer;
import com.rabbitmq.client.DefaultConsumer;
接收消息一般通过实现 Consumer 接口或者继承 DefaultConsumer 类来实现。当调用与Consumer相关的API方法时,不同的订阅采用不同的消费者标签(consumerTag)来区分彼此,在同一个channel中的消费者也通过唯一的消费者标签以作区分,关键消费代码如下:

 

和生产者一样,消费者客户端同样需要考虑线程安全的问题。消费者客户端的这些callback会被分配到与Channel不同的线程池上,这意味着消费者客户端可以安全地调用这些阻塞方法,比如:channel.quueDeclare、channel。basicCancel等。

每个channel都拥有自己独立的线程。最常用的做法是一个Channel对应一个消费者,也就是意味着消费者彼此之间没有任何关联。当然也可以在一个channel中维持多个消费者,但是要注意一个问题,如果channel的一个消费者一直在运行,那么其它消费者的callback会被耽搁。

(B)拉模式
通过 channel.basicGet 方法可以单条地获取消息,其 返回值是 GetRespone

 

 

消费端的确认与拒绝:

为了保证消息从队列可 地达到消费者, RabbitMQ 提供了消息确认机制 message
acknowledgement 消费者在订阅队列时,可以指定 aut oAck 参数,当 autoAck 等于 false
时, RabbitMQ 会等待消费者显式地回复确认信号后才从内存 (或者磁盘)中移去消息(实质上
是先打上删除标记,之后再删除)。当autoAck 等于 true 时, RabbitMQ 会自动把发送出去的
消息置为确认,然后从内存(或者磁盘)中删除,而不管消费者是否真正地消费到了这些消息

RabbitMQ 不会为未确认的消息设置过期时间,它判断此消息是否需要重新投递给消费者的
唯一依据是消费该消息的消费者连接是否己经断开,这么设计的原因是 RabbitMQ 许消费者
消费一条消息的时间可以很久很久。
在消费者接收到消息后,如果想明确拒绝当前的消息而不是确认,那么应该怎么做呢?
RabbitMQ 2.0.0 版本开始引入了 Basic.Reject 这个命令,消费者客户端可以调用与其对
应的 channel.basicReject 方法来告诉 RabbitMQ 拒绝这个消息。
关闭连接:
在应用程序使用完之后,需要关闭连接,释放资源:
channel.close();
conn.close();
显式地关闭 Channel 是个好习惯,但这不是必须的,在 Connection 关闭的时候,
Channel 也会自动关闭。

 

AMQP 协议中的 Con ection Channel 采用同样的方 来管理网络失败、内部错误和
显式地关闭连接。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值