点对点模式:
一对一模式 一个生产者投递消息给队列,只能允许有一个消费者进行消费。
注意:如果消费集群的话,会进行均摊消费。
配置类:
public class MQConnectionUtils {
// 创建新的MQ连接
public static Connection newConnection() throws IOException, TimeoutException {
// 1.创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2.设置连接地址
factory.setHost("127.0.0.1");
// 3.设置用户名称
factory.setUsername("guest");
// 4.设置用户密码
factory.setPassword("guest");
// 5.设置amqp协议端口号
factory.setPort(5672);
// 6.设置VirtualHost地址
factory.setVirtualHost("/sym");
Connection connection = factory.newConnection();
return connection;
}
}
生产消息者:
// 简单队列生产者
public class Producer {
// 队列名称
private static final String QUEUE_NAME = "sym";
public static void main(String[] args) throws IOException, TimeoutException {
// 1.创建一个新的连接
Connection connection = MQConnectionUtils.newConnection();
// 2.创建通道
Channel channel = connection.createChannel();
// 3.创建一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
for (int i = 1; i <= 10; i++) {
// 4.创建msg
String msg = "sym_msg_" + i;
System.out.println("生产者投递消息内容:" + msg);
// 5.生产者发送消息者
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
}
// 关闭通道和连接
channel.close();
connection.close();
}
}
消费消息者:
public class Consumer1 {
// 队列名称
private static final String QUEUE_NAME = "sym";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("消费者启动....01");
// 1.创建一个新的连接
Connection connection = MQConnectionUtils.newConnection();
// 2.创建通道
final Channel channel = connection.createChannel();
// 3.消费者关联队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
// 监听获取消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息:" + msg);
}
};
// 4.设置应答模式 如果为true情况下 表示为自动应答模式 false 表示为手动应答
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
// // 关闭通道和连接
// channel.close();
// connection.close();
}
}
消费消息者二:
public class Consumer2 {
// 队列名称
private static final String QUEUE_NAME = "sym";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("消费者启动....02");
// 1.创建一个新的连接
Connection connection = MQConnectionUtils.newConnection();
// 2.创建通道
final Channel channel = connection.createChannel();
// 3.消费者关联队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
// 监听获取消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息:" + msg);
}
};
// 4.设置应答模式 如果为true情况下 表示为自动应答模式 false 表示为手动应答
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
// // 关闭通道和连接
// channel.close();
// connection.close();
}
}
当消费者从对列服务器中获取消息时,会均摊消息对列里的消息,假设生产者向消费对列发送10条消息,消息一和消息二各自消费5个
效果截图:
先启动两个消费者,再启动生产者: