文章目录
1 rabbitmq通信的基本概念
1.0 生产者,消费者,消息,队列,虚拟主机的概念
1.0演示如何在后台管理页面创建一个虚拟主机test
后面演示的消息队列都放在test虚拟主机里面
1.0队列的消息状态3种,分别介绍
1.1 用rabbitMQ模拟一个简单一对一通信
1.1.1生产者
package com.ruoyi.project.rabbitmq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.ruoyi.project.rabbitmq.utils.RabbitConstant;
import com.ruoyi.project.rabbitmq.utils.RabbitUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 生产者
*/
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
// //ConnectionFactory用户创建mq物理连接
// ConnectionFactory connectionFactory = new ConnectionFactory();
// connectionFactory.setHost("127.0.0.1");
// //5672是RabbitMQ的默认端口
// connectionFactory.setPort(5672);
// connectionFactory.setUsername("zzy");
// connectionFactory.setPassword("123456");
// connectionFactory.setVirtualHost("/test");
// //TCP物理连接
// Connection connection = connectionFactory.newConnection();
Connection connection = RabbitUtils.getConnection();
//创建通信“通道”,相当于TCP中的虚拟连接
Channel channel = connection.createChannel();
//创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列
/**
* 参数1:队列名称ID
* 参数2:是否持久化,false对应不持久化数据,MQ停掉数据就会丢失
* 参数3:是否队列私有化,false则代表所有消费者都可以访问,true代表只有第一次拥有它的消费者才能一直使用,其他消费者
* 参数4:是否自动删除,false代表连接停掉后,不自动删除掉这个队列
* 其他额外参数为null
*/
channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD, false, false, false, null);
/**
* 四个参数
* exchange 交换机暂时用不到,在后面进行发布订阅时才会用到
* 队列名称
* 额外的设置属性
* 要传递的消息字节数组
*/
String message = "helloworld!!";
channel.basicPublish("", RabbitConstant.QUEUE_HELLOWORLD, null, message.getBytes());
channel.close();
connection.close();
System.out.println("数据发送成功");
}
}
1.1.2消费者
package com.ruoyi.project.rabbitmq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.ruoyi.project.rabbitmq.utils.RabbitConstant;
import com.ruoyi.project.rabbitmq.utils.RabbitUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消费者
*/
public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException {
// //ConnectionFactory用户创建mq物理连接
// ConnectionFactory connectionFactory = new ConnectionFactory();
// connectionFactory.setHost("127.0.0.1");
// //5672是RabbitMQ的默认端口
// connectionFactory.setPort(5672);
// connectionFactory.setUsername("zzy");
// connectionFactory.setPassword("123456");
// connectionFactory.setVirtualHost("/test");
// //TCP物理连接
// Connection connection = connectionFactory.newConnection();
Connection connection = RabbitUtils.getConnection();
//创建通信“通道”,相当于TCP中的虚拟连接
Channel channel = connection.createChannel();
channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD, false, false, false, null);
//创建一个消息消费者
/**
* 参数1:
* 餐数2:代表是否确认收到消息。false代表手动编程来确认消息。这是MQ推荐的做法
* 参数3:要传入DefaultConsumer的实现类
*/
channel.basicConsume(RabbitConstant.QUEUE_HELLOWORLD, false, new Reciver(channel));
}
}
1.1.3消费者默认的实现类
package com.ruoyi.project.rabbitmq;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
public class Reciver extends DefaultConsumer {
private Channel channel;
//重写构造函数,Channel通道对象需要从外层传入,在handleDelivery方法中要用到
public Reciver(Channel channel) {
super(channel);
this.channel = channel;
}
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//super.handleDelivery(consumerTag,envelope,properties,body);
String messageBody = new String(body);
System.out.println("消费者接收到:" + messageBody);
//签收消息。确认消息
/**
* 参数1:获取这个消息的TagID
* 参数2:false只确认签收当前的消息,设置为true:代表签收该消费这所有未签收的消息
*/
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
1.1.4 工具类和常量类
- 工具类
package com.ruoyi.project.rabbitmq.utils;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class RabbitUtils {
private static ConnectionFactory connectionFactory = new ConnectionFactory();
static {
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);//5672是RabbitMQ的默认端口号
connectionFactory.setUsername("zzy");
connectionFactory.setPassword("123456");
connectionFactory.setVirtualHost("/test");
}
public static Connection getConnection(){
Connection conn = null;
try {
conn = connectionFactory.newConnection();
return conn;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
- 常量类
package com.ruoyi.project.rabbitmq.utils;
/*@@请加Q群:369531466,与几百名工程师共同学习,遇到难题可随时@老齐,多一点真诚,少一点套路@@*/
public class RabbitConstant {
public static final String QUEUE_HELLOWORLD = "helloworld";
public static final String QUEUE_SMS = "sms";
public static final String EXCHANGE_WEATHER = "weather";
public static final String EXCHANGE_WEATHER_ROUTING = "weather_routing";
public static final String QUEUE_BAIDU = "baidu";
public static final String QUEUE_SINA = "sina";
public static final String EXCHANGE_WEATHER_TOPIC = "weather_topic";
}
2 rabbitMQ的6种工作模式
应用的话,主要针对2,3,4,5