1、使用docker安装
docker run -d --name rabbitmq_15672_5672 \
-v rabbitmq:/var/lib/rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:management
2、生产者代码
public class Consumer {
public static void main(String[] args) throws Exception {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置参数
factory.setHost("123.57.144.143");
factory.setPort(5672);
//账号密码
factory.setUsername("admin");
factory.setPassword("admin");
//创建连接对象
Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
/*
* 消费消息
* 1、消费哪个队列的消息
* 2、消费成功后是否自动取消应答,true:自动取消,false:手动取消
* 3、接收消息的回调函数
* 4、取消消息的回调函数
*/
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("接收的消息为:"+new String(message.getBody()));
};
CancelCallback cancelCallback = (consumerTag) ->{
System.out.println("消息被中断!");
};
channel.basicConsume("dz_queue_test",true,deliverCallback,cancelCallback);
}
}
3、消费者代码
public class Consumer {
public static void main(String[] args) throws Exception {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置参数
factory.setHost("123.57.144.143");
factory.setPort(5672);
//账号密码
factory.setUsername("admin");
factory.setPassword("admin");
//创建连接对象
Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
/*
* 消费消息
* 1、消费哪个队列的消息
* 2、消费成功后是否自动取消应答,true:自动取消,false:手动取消
* 3、接收消息的回调函数
* 4、取消消息的回调函数
*/
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("接收的消息为:"+new String(message.getBody()));
};
CancelCallback cancelCallback = (consumerTag) ->{
System.out.println("消息被中断!");
};
channel.basicConsume("dz_queue_test",true,deliverCallback,cancelCallback);
}
}
4、交换机的配置
1、direct交换机
-
生产者代码
public class ProducerDirect { public static void main(String[] args) throws Exception { //交换机名称 String exchangeName = "dz_exchange_test"; //队列名称 String queueName_1 = "dz_queue_test_1"; String queueName_2 = "dz_queue_test_2"; String queueName_3 = "dz_queue_test_3"; String queueName_4 = "dz_queue_test_4"; // 仅针对 DIRECT 交换机 //发送消息的时候,通过路由键进行发送,而不是指定队列名称进行发送 //拥有相同路由键的队列都会接收到由该路由键发送的消息,但是分别消费 String key_1 = "key_1"; String key_3 = "key_3"; String key_4 = "key_4"; //创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //设置参数 factory.setHost("123.57.144.143"); factory.setPort(5672); //账号密码 factory.setUsername("admin"); factory.setPassword("admin"); //创建连接对象 Connection connection = factory.newConnection(); //创建信道 Channel channel = connection.createChannel(); /* * 创建交换机 * 1、交换机的名称 * 2、交换机类型,fanout、topic、direct、headers * 3、指定交换机是否需要持久化,true:需要持久化,false:不需要持久化 * 4、指定交换机在没有队列绑定时是否需要删除,true:删除,false:不删除 * 5、Map<String,Object> 类型,用来指定我们交换机的其他一些机构化参数,我们在这里直接设置为null */ channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,null); /* * 生成一个队列 * 1、队列名称 * 2、队列是否需要持久化,但是要注意,这里的持久化只是对类名称等这元数据的持久化,不是队列中的消息的持久化 * 3、表示队列是不是私有的,如果是私有的,只有创建它的应用才能消费消息 * 4、队列在没有消费之订阅的情况下是否自动删除 * 5、队列的一些机构化参数信息,比如,声明私信队列,磁盘队列会用到 */ channel.queueDeclare(queueName_1,true,false,false,null); channel.queueDeclare(queueName_2,true,false,false,null); channel.queueDeclare(queueName_3,true,false,false,null); channel.queueDeclare(queueName_4,true,false,false,null); /* * 将交换机和队列进行绑定 * 1、队列名称 * 2、交换机名称 * 3、路由键,在直连模式下,路由键和队列名称是一致的 */ channel.queueBind(queueName_1,exchangeName,key_1); channel.queueBind(queueName_2,exchangeName,key_1); channel.queueBind(queueName_3,exchangeName,key_3); channel.queueBind(queueName_4,exchangeName,key_4); /* * 发送消息 * 1、发送到那个交换机 * 2、路由键名称 * 3、其他的参数信息 * 4、发送消息的消息体 */ channel.basicPublish(exchangeName,key_1,null,"key_1".getBytes()); channel.basicPublish(exchangeName,key_3,null,"key_3".getBytes()); channel.basicPublish(exchangeName,key_4,null,"key_4".getBytes()); //关闭连接 channel.close(); connection.close(); } }
2、fanout交换机
- 原理图
-
生产者代码
public class ProducerFanout { public static void main(String[] args) throws Exception { //交换机名称 String exchangeName = "dz_exchange_test_fanout"; //队列名称 String queueName_1 = "dz_queue_test_Fanout_1"; String queueName_2 = "dz_queue_test_Fanout_2"; String queueName_3 = "dz_queue_test_Fanout_3"; String queueName_4 = "dz_queue_test_Fanout_4"; // Fanout 交换机,不论路由键是多少,都会将消息发送给所有绑定的队列 // 这里演示设置不同的路由键 String key_1 = "key_1"; String key_3 = "key_3"; String key_4 = "key_4"; //创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //设置参数 factory.setHost("123.57.144.143"); factory.setPort(5672); //账号密码 factory.setUsername("admin"); factory.setPassword("admin"); //创建连接对象 Connection connection = factory.newConnection(); //创建信道 Channel channel = connection.createChannel(); /* * 创建交换机 * 1、交换机的名称 * 2、交换机类型,fanout、topic、direct、headers * 3、指定交换机是否需要持久化,true:需要持久化,false:不需要持久化 * 4、指定交换机在没有队列绑定时是否需要删除,true:删除,false:不删除 * 5、Map<String,Object> 类型,用来指定我们交换机的其他一些机构化参数,我们在这里直接设置为null */ channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true,false,null); /* * 生成一个队列 * 1、队列名称 * 2、队列是否需要持久化,但是要注意,这里的持久化只是对类名称等这元数据的持久化,不是队列中的消息的持久化 * 3、表示队列是不是私有的,如果是私有的,只有创建它的应用才能消费消息 * 4、队列在没有消费之订阅的情况下是否自动删除 * 5、队列的一些机构化参数信息,比如,声明私信队列,磁盘队列会用到 */ channel.queueDeclare(queueName_1,true,false,false,null); channel.queueDeclare(queueName_2,true,false,false,null); channel.queueDeclare(queueName_3,true,false,false,null); channel.queueDeclare(queueName_4,true,false,false,null); /* * 将交换机和队列进行绑定 * 1、队列名称 * 2、交换机名称 * 3、路由键,在直连模式下,路由键和队列名称是一致的 */ channel.queueBind(queueName_1,exchangeName,key_1); channel.queueBind(queueName_2,exchangeName,key_1); channel.queueBind(queueName_3,exchangeName,key_3); channel.queueBind(queueName_4,exchangeName,key_4); /* * 发送消息 * 1、发送到那个交换机 * 2、路由键名称 * 3、其他的参数信息 * 4、发送消息的消息体 */ // 这里只给一个队列发送消息,但是会被所有绑定的对类收到 channel.basicPublish(exchangeName,key_1,null,"Fanout_key_1".getBytes()); //关闭连接 channel.close(); connection.close(); } }