(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命令或者更好的是从配置中心下发。
如果在后期运行过程中超过预定的阈值,可以根据实际情况对当前集群进行扩容或者将相应的队列迁移到其他集群。迁移的过程也可以对业务程序完全透明。

和生产者一样,消费者客户端同样需要考虑线程安全的问题。消费者客户端的这些callback会被分配到与Channel不同的线程池上,这意味着消费者客户端可以安全地调用这些阻塞方法,比如:channel.quueDeclare、channel。basicCancel等。
每个channel都拥有自己独立的线程。最常用的做法是一个Channel对应一个消费者,也就是意味着消费者彼此之间没有任何关联。当然也可以在一个channel中维持多个消费者,但是要注意一个问题,如果channel的一个消费者一直在运行,那么其它消费者的callback会被耽搁。



消费端的确认与拒绝:

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

被折叠的 条评论
为什么被折叠?



