1、参考文档
2、重要概念
2.1 virtual hosts
虚拟主机,一个虚拟主机相当于一个独立的空间,虚拟主机之间是相互隔离、互不影响的。
2.2 producer
生产者,投递消息的一方
2.3 consumer
消费者,接收消息的一方
消费者定义
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
System.out.println("接收到消息:" + new String(body, "UTF-8"));
// 手动消息签收
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
2.4 connection
连接,生产者或者消费者与rabbit服务器之间建立的长连接(默认端口是5672)
建立连接的过程如下
// 1.定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2.设置服务器地址
factory.setHost("127.0.0.1");
// 3.设置协议端口号
factory.setPort(5672);
// 4.设置vhost
factory.setVirtualHost("/test");
// 5.设置用户名称
factory.setUsername("test");
// 6.设置用户密码
factory.setPassword("test");
// 7.创建新的连接
Connection connection = factory.newConnection();
2.5 channel
通道,主要用于投递消息和接收消息
常见api
// 创建通道
Channel channel = connection.createChannel();
// 创建队列声明
// 注意:第二个参数为是否持久化,true:持久化,false:不持久化。持久化的队列数据,会存到硬盘上,在rabbitmq重启或者宕机后,还会保留。
channel.queueDeclare("queue", false, false, false, null);
// 交换机与队列绑定
channel.queueBind("queue", "exchange", "routingKey");
// 绑定交换机
// 注意:第二个参数为交换机类型,【direct,fanout,topic,headers】
channel.exchangeDeclare("exchange", "fanout");
// 发送消息
channel.basicPublish("exchange", "routingKey", null, "msg".getBytes());
// 消息流量控制
channel.basicQos(1);
// 绑定消费者
// 注意:第二个参数false:表示需要手动签收消息;如果为true,自动签收消息
channel.basicConsume(queue, false, consumer);
// 手动签收消息
channel.basicAck(envelope.getDeliveryTag(), false);
2.6 exchange
交换器,指定消息路由规则,发送到哪个队列
交换机种类
- direct:简单队列与工作队列使用此交换机类型
可以不绑定交换机,使用默认的交换机即可,把消息路由到那些RouteKey与queue名字完全一致的Queue中。
- fanout:发布订阅用的此类型交换机
不处理RouteKey ,绑定【fanout】类型交换机,把所有发送到fanout Exchange的消息都转发到与该Exchange 绑定(Binding)的所有Queue上
- topic:主题模式
绑定【topic】类型交换机,会根据RouteKey匹配规则来转发消息到对应的队列中
RouteKey主要有两个通配符:*,匹配一个单词;#,匹配一个到多个单词
- headers
根据发送的消息内容中的headers属性进行匹配。未实际测试
2.7 queue
队列,交换器接收到消息后,会根据路由规则,投递到一个或者多个队列中;如果按路由策略找不到对应的队列,消息会被丢弃。
2.8 bindding
绑定关系,绑定交换机、队列,并设置路由策略。