安装RabbitMQ:
RabbitMQ 概念:
命令使用
快速起步
-------------------------
安装RabbitMQ:
windows 下安装教程:
https://blog.csdn.net/zhm3023/article/details/82217222
Linux 下安装:(暂略)
交换机概念:
一个图:
直接交换机器:
交换机和Exchange 连接管道,
交换机定义:
直接交换机通过绑定绑定一个队列,带入那个必须完全匹配,发消息的时候,原来的时候
完全匹配,直接交换机器,
主题交换机:
最先的匹配上,topic 交换机:绑定的视乎---tuling,key.*----队列
或者是井号,多个单词,发送消息的时候,带入的那个key和原来的绑定的
key完全匹配,路由队列的。
扇形交换机:
三种交换机性能上比较:扇形交换机最高,因为不需要字符串比较。
命令使用:
查看查看所有的队列
清除所有的队列:
查看用户:
查看状态:
创建用户:
授予用户权限:
改变用户密码信息:
changer_password zhangsan zhangsan
这些命令也可以在管理控制台完成。
参见相关命令手册:
快速起步:
生产端:
package com.tuling.quickstart;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class RabbitmqProducter {
public static void main(String[] args) throws IOException, TimeoutException {
//1:创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//2设置连接工厂的属性
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//3:通过连接工厂创建连接对象
Connection connection = connectionFactory.newConnection();
//4:通过连接创建channel
Channel channel = connection.createChannel();
//5:通过channel发送消息
for(int i=0;i<5;i++) {
String message = "hello--"+i;
channel.basicPublish("","tuling-queue-01",null,message.getBytes());
}
//6:关闭连接
channel.close();
connection.close();
}
}
2.消费端:
package com.tuling.quickstart;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class RabbitmqConsumer {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建一个channel
Channel channel = connection.createChannel();
//声明队列
String queueName = "tuling-queue-01";
channel.queueDeclare(queueName,true,false,true,null);
//创建消费者
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
channel.basicConsume(queueName,true,queueingConsumer);
while (true) {
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
String reserveMsg = new String(delivery.getBody());
System.out.println("消费消息:"+reserveMsg);
}
}
}
结果:
直接交换机:
package com.tuling.direct_exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class DirectExchangeProductor {
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//2设置连接工厂的属性
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建channel
Channel channel = connection.createChannel();
//定义交换机名称
String exchangeName = "tuling.directchange";
//定义routingKey
String routingKey = "tuling.directchange.key11111111";
//消息体内容
String messageBody = "hello tuling ";
channel.basicPublish(exchangeName,routingKey,null,messageBody.getBytes());
}
}
消费者:
package com.tuling.direct_exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class DirectExchangeConsumer {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//2设置连接工厂的属性
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建channel
Channel channel = connection.createChannel();
String exchangeName = "tuling.directchange";
String exchangeType = "direct";
String queueName = "tuling.directqueue";
String routingKey = "tuling.directchange.key";
/**
* 声明一个交换机
* exchange:交换机的名称
* type:交换机的类型 常见的有direct,fanout,topic等
* durable:设置是否持久化。durable设置为true时表示持久化,反之非持久化.持久化可以将交换器存入磁盘,在服务器重启的时候不会丢失相关信息
* autodelete:设置是否自动删除。autoDelete设置为true时,则表示自动删除。自动删除的前提是至少有一个队列或者交换器与这个交换器绑定,之后,所有与这个交换器绑定的队列或者交换器都与此解绑。
* 不能错误的理解—当与此交换器连接的客户端都断开连接时,RabbitMq会自动删除本交换器
* arguments:其它一些结构化的参数,比如:alternate-exchange
*/
channel.exchangeDeclare(exchangeName,exchangeType,true,false,null);
/**
* 声明一个队列
* durable:表示rabbitmq关闭删除队列
* autodelete:表示没有程序和队列建立连接 那么就会自动删除队列
*
*/
channel.queueDeclare(queueName,true,false,false,null);
/**
* 队里和交换机绑定
*/
channel.queueBind(queueName,exchangeName,routingKey);
/**
* 创建一个消费者
*/
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
/**
* 开始消费
*/
channel.basicConsume(queueName,true,queueingConsumer);
while (true) {
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
String reciverMessage = new String(delivery.getBody());
System.out.println("消费消息:-----"+reciverMessage);
}
}
}
扇形交换机:
生产者:
package com.tuling.fanout_exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class FanoutExchangeProductor {
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建channel
Channel channel = connection.createChannel();
//定义交换机名称
String exchangeName = "tuling.fanoutexchange";
//定义routingKey
String routingKey = "";
//消息体内容
String messageBody = "hello tuling ";
channel.basicPublish(exchangeName,"123",null,"我是第一条消息".getBytes());
channel.basicPublish(exchangeName,"456",null,"我是第二条消息".getBytes());
channel.basicPublish(exchangeName,"789",null,"我是第三条消息".getBytes());
}
}
消费者:
package com.tuling.fanout_exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class FanoutExchangeConsumer {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建channel
Channel channel = connection.createChannel();
//声明交换机
String exchangeName = "tuling.fanoutexchange";
String exchangeType = "fanout";
channel.exchangeDeclare(exchangeName,exchangeType,true,true,null);
//声明队列
String quequName = "tuling.fanout.queue";
channel.queueDeclare(quequName,true,false,false,null);
//声明绑定关系
String bingdingStr = "jjsadf";
channel.queueBind(quequName,exchangeName,bingdingStr);
//声明一个消费者
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
//开始消费
/**
* 开始消费
*/
channel.basicConsume(quequName,true,queueingConsumer);
while (true) {
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
System.out.println("接受到消息:"+new String(delivery.getBody()));
}
}
}
topic交换机:
生产者:
package com.tuling.topic_exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class TopicExchangeProductor {
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建channel
Channel channel = connection.createChannel();
//发送消息
String exchangeName = "tuling.topicexchange";
String routingKey1 = "tuling.key1";
String routingKey2 = "tuling.key2";
String routingKey3 = "tuling.key.key3";
channel.basicPublish(exchangeName,routingKey1,null,"我是第一条消息".getBytes());
channel.basicPublish(exchangeName,routingKey2,null,"我是第二条消息".getBytes());
channel.basicPublish(exchangeName,routingKey3,null,"我是第三条消息".getBytes());
}
}
消费者:
package com.tuling.topic_exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class TopicExchangeConsumer {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建channel
Channel channel = connection.createChannel();
//声明交换机
String exchangeName = "tuling.topicexchange";
String exchangeType = "topic";
channel.exchangeDeclare(exchangeName,exchangeType,true,true,null);
//声明队列
String quequName = "tuling.topic.queue";
channel.queueDeclare(quequName,true,false,false,null);
//声明绑定关系
String bingdingStr = "tuling.*";
channel.queueBind(quequName,exchangeName,bingdingStr);
//声明一个消费者
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
//开始消费
/**
* 开始消费
*/
channel.basicConsume(quequName,true,queueingConsumer);
while (true) {
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
System.out.println("接受到消息:"+new String(delivery.getBody()));
}
}
}
参考资料: