本文根据视频:https://www.bilibili.com/video/BV1pa4y1x7Kc?p=4编写
未经作者授权,如果感到有侵权,请联系本人删除此文。
生产者代码实例
package com.qingcheng.rabbitmq.service;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
*@description 消费者
*@author Qingcheng Wang
*@date 2020/6/21 0021
*/
public class Producer {
private static final String QUEUE = "helloworld";
public static void main(String[] args) {
//通过连接工厂创建新的连接和MQ建立连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
//设置虚拟机,一个MQ可以设置多个虚拟机,每个虚拟机相当于一个独立的MQ
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = null;
Channel channel = null;
try {
//建立新的连接
connection = connectionFactory.newConnection();
//创建会话通道,生产者和MQ服务所有通信都在channel通道中完成
channel = connection.createChannel();
//声明队列,如果队列在MQ中不存在则创建
//参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String,Object> arguments
/**
* 参数明细
* 1. queue 队列名称
* 2. durable 是否持久化,持久化则MQ重启后队列存在
* 3. exclusive 是否独占连接,队列只允许在该连接中访问,如果连接关闭则队列自动删除,如果将此参数设置ture可用于临时队列的创建
* 4. autoDelete 自动删除, 队列不再使用时是否自动删除队列,如果此参数和exclusive参数设置为true就可以实现临时队列(队列不用就自动删除)
* 5. arguments 参数,可以设置一个对列的扩展参数,比如,存活时间
*/
channel.queueDeclare(QUEUE, true, false, false,null);
//发送消息
//参数:String exchange, String routingKey, BasicProperties props, byte[] body
/**
* 参数明细
* 1. exchange 交换机,如果不指定则使用mq的默认交换机,参数不能为null
* 2. routingKey 路由key, 交换机根据路由key来将消息转发到指定的队列,如果使用默认交换机,routingKey设置为队列的名称
* 3. props 消息的属性
* 4. body 消息内容
*/
String message = "Hello World";
channel.basicPublish("", QUEUE, null, message.getBytes());
System.out.println("send to mq " + message);
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
//先关闭通道,在关闭连接
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
消费者代码实例
package com.qingcheng.rabbitmq.service;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {
private static final String QUEUE = "helloworld";
public static void main(String[] args) throws IOException, TimeoutException {
//通过连接工厂创建新的连接和MQ建立连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
//设置虚拟机,一个MQ可以设置多个虚拟机,每个虚拟机相当于一个独立的MQ
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//建立新的连接
Connection connection = connectionFactory.newConnection();
//创建会话通道,生产者和MQ服务所有通信都在channel通道中完成
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE, true, false, false,null);
//实现消费方法
DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
/**
* 当消费者接收到消息后方法将被调用
* @param consumerTag 消费者标签,用来表示消费者,可在监听队列时设置channel.basicConsume
* @param envelope 信封,通过envelop获取信息
* @param properties 消息属性
* @param body 消息内容
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String exchange =envelope.getExchange();
//消息id, mq在channel中用来标识消息的id, 可用于确认消息已接收
long deliveryTag =envelope.getDeliveryTag();
String message = new String(body, "UTF-8");
System.out.println("receive message: " + message);
}
};
//监听队列
//参数: String queue, boolean autoAck, Consumer callback
/**
* 参数明细
* 1. queue 队列名称
* 2. autoAck 自动回复,当消费者接受到消息后要告诉mq消息已接收,粗如果此参数设为true表示自动回复mq, 如果设置为false要通过编程实现回复
* 3. callback 消费方法,当消费者接受到消息要执行的方法
*/
channel.basicConsume(QUEUE, true, defaultConsumer);
}
}