RabbitMq 有六种模式(我觉得就是从第一个模式开始不断升级)
1:Hello-Wold HelloWorld模式
2: Work Queues 工作模式
3: Publish/Subscribe 发布订阅模式
4: Routing 路由模式
5: Topics 通配符模式
6: RPC RPC模式
让我为大家依次讲解
Productor---->channel---->Exchange----->Queue---->Channel---->Consumer
(这里是全部大部分都是默认的需要自定义)
就是生产者给通过通道发送给交换机 然后交换机进行筛选让然后传送到通道里面,在经过通道传送给消费者
打个比方吧:这个流程就像是一个快递流水线
Productor就是生产快递的商家
channel就是他是在商家打包成快递的通道
Exchange就是商家进行区分哪个是你的快递
Queue:就是在运输种这个通道
Channel:第二个channel就是到快递员送到你手里的通道
Consumer:就是购买这个快递的消费者
重点:重要的说三遍!!!!
根据上面的原理
(根据需求)必须要建立声明通道、交换机、队列
这个就是一对一的模式
打个比喻1:就是(呼吁必有回声)如果你不想接他就给你留的直到你接为止(感觉好像有点倒贴)
这个Hello World模式 他是生产者和消费者的关系 中间有一个Queue(队列)
connectionFactory.setHost("127.0.0.1");//默认是本机 connectionFactory.setPort(5672);//端口号必须是5675 connectionFactory.setUsername("guest");//默认用户名和密码 connectionFactory.setPassword("guest");//默认用户名和密码 connectionFactory.setVirtualHost("/");//默认服务器连接时使用的虚拟主机路径
package com.example.hyzn.demos.TestRabbitMQ.productor;
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 TestMQpProductor {
private static final String QUEUE = "Hello World";
public static void main(String[] args) {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = connectionFactory.newConnection();
channel = connection.createChannel();
// 声明一个队列 如果不存在就创建
channel.queueDeclare(QUEUE, true, false, false, null);
String message = "HElloWOrld";
// 将消息发送到队列中
channel.basicPublish("", QUEUE, null, message.getBytes());
System.out.println("Message sent: " + message);
} catch (IOException | TimeoutException e) {
e.printStackTrace();
} finally {
try {
if (channel != null) {
channel.close();
}
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.example.hyzn.demos.TestRabbitMQ.consumer;
import com.rabbitmq.client.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class TestMQConsumer {
private static final String QUEUE = "Hello World";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = connectionFactory.newConnection();
channel = connection.createChannel();
// 消费者判断队列是否存在
channel.queueDeclare(QUEUE, true, false, false, null);
// 定义消费者
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String exchange = envelope.getExchange();
long deliveryTag = envelope.getDeliveryTag();
String message = new String(body, "utf-8");
System.out.println("已经收到了消息: " + message);
}
};
channel.basicConsume(QUEUE, true, defaultConsumer);
} catch (IOException | TimeoutException e) {
e.printStackTrace();
} finally {
}
}
}
工作队列就是一对多的关系
是按生产的数量平均分发给消费者
按轮询的方式分发
打个比喻就像是:有十块糖 分别发送给俩个小孩 一个给A 一个给B
而不是直接一个人五个 (可以理解为见证公平)
这个处理代码就是按照Hello World 的模式 多开几个消费者 只开一个消费者运行就可以了
这个就用到交换机了
1.一个生产者将消息发给交换机
2.与交换机绑定的有多个队列,每个消费者监听自己的队列
3.生产者将消息发给交换机 ,由交换机将消息转发给绑定的每个队列,每个队列都将接到消息
4.如果没有消息发给交换机,那么这条消息就会丢失
生产者代码:
package com.example.hyzn.demos.TestRabbitMQ.productor;
import com.rabbitmq.client.BuiltinExchangeType;
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 TestMQpProductor_Public {
private static final String QUEUE_INFOM_sms = "发短信";
private static final String QUEUE_INFOM_email = "发邮箱";
private static final String EXCHANFGE_FANOUT_INFORM = "chanel交换机";
public static void main(String[]