用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展的通信。
定义:直连类型的交换机与一个队列绑定时,需要指定一个明确的binding key。
路由规则:发现消息到直连类型的交换机时,只有routing key和binding key完全匹配时,绑定的队列才能收到消息。
channel.basicPublish("DirectExchangeName", "binging key", null, msg.getBytes());
定义:主题类型的交换机与一个队列绑定时,可以指定按模式匹配的routing key。
匹配通配符有两个,* 代表匹配一个单词。# 代表匹配零个或者多个单词。单词与单词之间用.隔开。如:
路由规则:发送消息到主题类型的交换机时,routing key 符合 binding key 的规则时,绑定的队列才能收到消息。
// 队列1和队列3能收到消息
channel.basicPublish("TopicExchangeName", "kiss.my", null, msg.getBytes());
// 队列2和队列4能收到消息
channel.basicPublish("TopicExchangeName", "my.kiss", null, msg.getBytes());
// 只有队列3能收到消息
channel.basicPublish("TopicExchangeName", "kiss.my.you", null, msg.getBytes());
// 只有队列4能收到消息
channel.basicPublish("TopicExchangeName", "my.you.kiss", null, msg.getBytes());
定义:广播类型的交换机与一个队列 绑定时,不需要指定binding key。
路由规则:当消息发送到广播类型的交换机时,不需要指定routing key,所有与之绑定的队列都能收到消息。
// 3个队列都会收到消息
channel.basicPublish("FanoutExchangeName", "", null, msg.getBytes());
<dependency>
<groupId>com.rabbitmqgroupId>
<artifactId>amqp-clientartifactId>
<version>5.7.3version>
dependency>
public class RabbitMQConfig {
private RabbitMQConfig() {
}
// 主机IP
public static final String HOST = "127.0.0.1";
// 主机port
public static final Integer PORT = 5672;
// 主机port
public static final String VHOST = "/";
// 主机port
public static final String USERNAME = "admin";
// 主机port
public static final String PASSWORD = "admin";
// 交换机名称
public static final String DIRECT_EXCHANGE = "direct_exchange";
// 队列名称
public static final String QUEUE_NAME = "direct_queue";
// Routing key
public static final String ROUTING_KEY = "kiss";
}
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消费者
*/
public class MessageConsumer {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
// 设置主机IP
factory.setHost(RabbitMQConfig.HOST);
// 设置端口
factory.setPort(RabbitMQConfig.PORT);
// 设置 Vhost
factory.setVirtualHost(RabbitMQConfig.VHOST);
// 设置访问用户
factory.setUsername(RabbitMQConfig.USERNAME);
factory.setPassword(RabbitMQConfig.PASSWORD);
// 建立连接
Connection connection = factory.newConnection();
// 创建Channel消息通道
Channel channel = connection.createChannel();
/**
* 声明交换机,参数String exchange, String type, boolean durable, boolean autoDelete, Map arguments
*
* String exchange:指定交换机名称
* String type:路由类型,direct、topic、fanout
* boolean durable:是否持久化
* boolean autoDelete:是否自动删除
* Map arguments:其他参数
*/
channel.exchangeDeclare(RabbitMQConfig.DIRECT_EXCHANGE, "direct", false, false, null);
/**
* 声明队列,参数String queue, boolean durable, boolean exclusive, boolean autoDelete, Map arguments
* String queue:指定队列名称
* boolean durable:是否持久化
* boolean exclusive:是否排他,既是否创建者私有,如果为true,会对当前队列加锁,其他通道不能访问,并且
* 在连接关闭时会自动删除,不受持久化和自动删除限制
* boolean autoDelete:是否自动删除
* Map arguments:其他参数
*/
channel.queueDeclare(RabbitMQConfig.QUEUE_NAME, false, false, false, null);
/**
* 绑定交换和队列,参数String queue, String exchange, String routingKey, Map arguments
*/
channel.queueBind(RabbitMQConfig.QUEUE_NAME, RabbitMQConfig.DIRECT_EXCHANGE, RabbitMQConfig.ROUTING_KEY, null);
// 创建消费者
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
// 获取消息
String msg = new String(body, "UTF-8");
System.out.println("consumer message:" + msg);
}
};
// 开始获取消息String queue, boolean autoAck, Consumer callback
channel.basicConsume(RabbitMQConfig.QUEUE_NAME, true, consumer);
}
}
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 生产者
*/
public class MessageProvider {
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
// 设置主机IP
factory.setHost(RabbitMQConfig.HOST);
// 设置端口
factory.setPort(RabbitMQConfig.PORT);
// 设置 Vhost
factory.setVirtualHost(RabbitMQConfig.VHOST);
// 设置访问用户
factory.setUsername(RabbitMQConfig.USERNAME);
factory.setPassword(RabbitMQConfig.PASSWORD);
try (
// 建立连接
Connection connection = factory.newConnection();
// 创建Channel消息通道
Channel channel = connection.createChannel();
) {
String msg = "阁下可是常山赵子龙";
channel.basicPublish(RabbitMQConfig.DIRECT_EXCHANGE, RabbitMQConfig.ROUTING_KEY, null, msg.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
}