Rabbitmq主要的组件要记住并且要知道它们之间的关系
1.broker mq服务器用来存队列,交换机等消息
2.交换机 负责将消息转发给队列
3.队列 存储消息的容器
4.Connection 用来连接mq服务器
5.channel信道 负责与mq服务器交互通信,如:发送消息到mq服务器,消费队列,创建交换机,创建队列等操作
6.VirtualHost 分区操作,类似与mysql的分库操作进行数据的独立
关系
交换机和队列关系-多对多
1.一个交换机可以绑定多个队列,一个队列可以被多个交换机绑定
Connection和信道关系
1.一个连接可以创建多个信道
Der häufig verwendete Rabbitmq-Modus
1. Einfacher Modus
2. Arbeitswarteschlangenmodus
3.Fanout-Veröffentlichungs- und Abonnementmodus
4. Direkter Routing-Modus
5. Themen-Wildcard-Routing-Muster
Werkzeug
public class RabbitMQUtils {
private Channel channel;
private Connection connection;
public Channel getChannel() throws IOException, TimeoutException {
//配置连接参数创建工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.93.132");
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
this.connection=connection;
this.channel=connection.createChannel();
return channel;
}
public void close(){
if(channel != null){
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
if(connection != null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1. Einfacher Modus
/**
* 简单模式一对一 一个生产者对应一个消费者
*/
public class ProducerHello {
private final static String QUEUE_NAME="hello";
public static void main(String[] args) throws Exception {
RabbitMQUtils rabbitMQUtils = new RabbitMQUtils();
Channel channel = rabbitMQUtils.getChannel();
/**
* 创建队列,1.如果该队列存在就不创建,2.如果队列不存在自动创建,3.如果队列存在但是和下列参数不匹配就报错删除原队列即可
*queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
* queue 队列名称
* durable 是否支持持久化默认false
* exclusive 该队列是否只能由当前channel使用
* autoDelete 消费者断开连接以后自动删除消息false不删除
* arguments 其他参数
*/
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
// 以下是消费者代码=========================================================================================
/**
* basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
* exchange 发送到哪个交换机
* routingKey 路由k是谁
* props 其他参数信息
* body 发送的消息
*/
for (int i = 0; i <10 ; i++) {
String message="hello world"+i;
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
}
//处理正常消息的匿名内部类
DeliverCallback deliverCallback = (consumerTag, delivery)->{
String message = new String(delivery.getBody());
System.out.println("队列消费成功:"+message);
};
//处理失败消息的匿名内部类
CancelCallback cancelCallback = (consumerTag)->{
System.out.println("队列消费失败"+new String(consumerTag.getBytes()));
};
channel.basicConsume(QUEUE_NAME,false,deliverCallback,cancelCallback);
}
}