入门案例
一、生产者
依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.6.0</version>
</dependency>
Producer
/**
* @Author: jinv
* @CreateTime: 2020-06-10 17:49
* @Description: 生产者
*/
public class Producer {
private static String queueName = "itheima";
public static void main(String[] args) throws Exception {
//1.创建一个ConnectionFactory并进行配置
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("39.97.123.123");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");//默认为guest
connectionFactory.setPassword("admin");//默认为guest
connectionFactory.setVirtualHost("my_vhost");//默认为/
connectionFactory.setHandshakeTimeout(20000);
//2.通过链接工厂创建连接
Connection connection = connectionFactory.newConnection();
//3.通过Connection创建一个Channel
Channel channel = connection.createChannel();
/**
* 参数一:队列名称
* 参数二:是否定义持久化队列
* 参数三:是否独占本次连接
* 参数四:会否在不使用的时候自动删除队列
* 参数五:队列其他参数
*/
channel.queueDeclare(queueName,true,false,false,null);
//4.通过Channel发送数据
for (int i = 0;i<5;i++){
System.out.println("生产消息"+i);
String msg = "Hello rabbitMQ"+i;
channel.basicPublish("",queueName,null,msg.getBytes());
}
//关闭连接
channel.close();
connection.close();
}
}
可以点击itheima这个队列查看接收到的生产消息
因为没有消费者,所以这些消息没有背删除而是缓存在队列里
二、消费者
依赖同上
ConnectionUtils:返回一个rabbitMQ连接
/**
* @Author: jinv
* @CreateTime: 2020-06-10 22:16
* @Description: rabbitMQ连接工具类
*/
public class ConnectionUtils {
public static Connection getConnection() throws Exception {
//创建连接工厂
ConnectionFactory connectionFactory =new ConnectionFactory();
//主机地址:默认localhost
connectionFactory.setHost("39.97.123.123");
//连接端口:默认5672
connectionFactory.setPort(5672);
//虚拟主机名称:默认/
connectionFactory.setVirtualHost("my_vhost");
//连接用户名,默认guest
connectionFactory.setUsername("admin");
//连接密码,默认guest
connectionFactory.setPassword("admin");
return connectionFactory.newConnection();
}
}
Consumer
/**
* @Author: jinv
* @CreateTime: 2020-06-10 22:11
* @Description: 消费者
*/
public class Consumer {
public static void main(String[] args) throws Exception {
//获取连接
Connection connection = ConnectionUtils.getConnection();
//创建频道
Channel channel =connection.createChannel();
//创建队列,并设置消息处理
channel.queueDeclare(Producer.queueName,true,false,false,null);
//监听消息
DefaultConsumer consumer = new DefaultConsumer(channel){
/**
*
* @param consumerTag:消息标签,在channel.basicConsume时候可以指定
* @param envelope:消息包内容,可以从中取消息id,消息routingkey,交换机,消息和重转标记(收到消息失败后是否需要重新发送)
* @param properties:消息属性
* @param body:消息
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("路由key为:"+envelope.getRoutingKey());
System.out.println("交换机为:"+envelope.getExchange());
System.out.println("消息id为:"+envelope.getDeliveryTag());
//收到的消息
System.out.println("接收到的消息为:"+new String(body,"UTF-8"));
System.out.println();
System.out.println("=====================================================");
System.out.println();
}
};
/**
* 监听消息
* 参数一:队列名称
* 参数二:是否自动确认。设置为true表示消息接收到自动向mq回复收到了,mq接收到回复后会删除消息,设置为false则需要手动确认
*/
channel.basicConsume(Producer.queueName,true,consumer);
//不关闭链接,应该一直坚挺消息
}
}
注意消费者监听队列是不关闭流的
生产者再生产消息,消费者也能监听到,并且队列缓存会删除被消费者消费了的消息