RabbitMQ简单模式–直连,相当于点对点连接一样
在上图的模型中,有以下概念:
P:生产者,也就是要发送消息的程序
C:消费者:消息的接受者,会一直等待消息到来。
queue:消息队列,图中红色部分。类似一个邮箱,
可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
应用场景我们可以应用于用户的登录,登录以后向消息队列中发送一条登录消息,后台读取到消息可以对用户登录积分加一
代码如下:
连接消息队列的工具类
package com.zuoan.utils;
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: TODO
* @Author: 黄石军
* @CreateTime: 2022/4/9 16:56
* @Company:
*/
public class RabbitMQUtils {
//创建连接工厂,在类加载时创建,只创建一次
private static ConnectionFactory connectionFactory;
static {
connectionFactory = new ConnectionFactory();
//设置端口号
connectionFactory.setPort(5672);
//设置主机名称
connectionFactory.setVirtualHost("/ems");
//设置访问虚拟主机的用户名和密码
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
}
//提供一个创建连接的方法
public static Connection getConnection(String host) {
try {
// 设置连接rabbitmq主机
connectionFactory.setHost(host);
return connectionFactory.newConnection();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
return null;
}
public static void closeChannelAndConnection(Channel channel, Connection connection) {
if (channel != null) {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
生产者
package com.zuoan;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.zuoan.utils.RabbitMQUtils;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Description: TODO
* @Author: 黄石军
* @CreateTime: 2022/4/9 15:53
* @Company:
*/
public class Provider {
@Test
public void testSendMessage() throws IOException, TimeoutException {
Connection connection = RabbitMQUtils.getConnection("192.168.128.100");
//获取连接中通道
Channel channel = connection.createChannel();
//将通道与消息队列绑定
//参数一:队列名称,参数二:是否持久化,参数三:是否独占队列,参数四:是否在消费完成后自动删除队列,
channel.queueDeclare("hello",false,false,false,null);
//发布消息
//参数一:交换机名称,参数二:队列名称,参数三:消息额外属性,参数四:消息内容
channel.basicPublish("","hello",null,"hello rabbitmq".getBytes());
RabbitMQUtils.closeChannelAndConnection(channel,connection);
}
}
消费者
package com.zuoan;
import com.rabbitmq.client.*;
import com.zuoan.utils.RabbitMQUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Description: TODO
* @Author: 黄石军
* @CreateTime: 2022/4/9 16:14
* @Company:
*/
public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = RabbitMQUtils.getConnection("192.168.128.100");
//创建连接通道
Channel channel = connection.createChannel();
//通道绑定对象
channel.queueDeclare("hello",false,false,false,null);
//消费消息
//参数一:队列名称 参数二:开始消费时自动确认机制 参数三:消费时的回调接口
channel.basicConsume("hello",true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("new String(body) = "+ new String(body));
}
});
// channel.close();
// connection.close();
}
}
每运行一次provider都会向消息队列中添加一条消息,consumer一直运行着不会停止,取出队列中的消息