demo下载地址:https://gitee.com/wuhan1/rabbitmq-demo.git
简单队列的模式图
特点:一个生产者对应一个消费者,生产者将消息发送到指定队列。消费者从该队列接收消息。
引入jar包
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
1.编写连接工具类ConnectionUtils
public class ConnectionUtils {
private ConnectionUtils(){}
private static final String HOST = "localhost";
private static final int PORT =5672;
private static final String USER_NAME = "guest";
private static final String PASS_WORD = "guest";
private static final String V_HOST = "/";
/**
* 通过连接工厂获取连接
*/
public static Connection getConn() throws IOException, TimeoutException{
//1、定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2、设置服务器地址
factory.setHost(HOST);
//3.设置端口
factory.setPort(PORT);
//4、设置虚拟主机、用户名、密码
factory.setVirtualHost(V_HOST);
factory.setUsername(USER_NAME);
factory.setPassword(PASS_WORD);
return factory.newConnection();
}
}
其中vhost的作用:实际就是起隔离的作用,更详细的解释:本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制;通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据;AMQP概念的基础,必须在连接时进行指定,RabbitMQ包含了默认vhost:“/”;在RabbitMQ中创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派vhost内的队列、交换器和绑定,vhost之间是绝对隔离的
2.编写生产者
public class SimpleProduct {
public static final String SIMPLE_QUEUE = "simple_queue";
public static void main(String[] args) throws IOException, TimeoutException {
Connection conn = ConnectionUtils.getConn();
//声明信道
Channel channel = conn.createChannel();
//声明队列,durable true声明一个持久队列(该队列将在服务器重新启动后继续存在),exclusive=true声明独占队列(仅限于此连接)
//autoDelete true服务器将在不再使用时删除它, arguments队列的其他属性
channel.queueDeclare(SIMPLE_QUEUE, true, false, false, null);
//消息内容
String message = "简单对列模式";
//发布消息
channel.basicPublish("", SIMPLE_QUEUE, null, message.getBytes());
//关闭
channel.close();
conn.close();
}
}
这几个参数注意跟创建队列的时候选择的保持一致,不然会报错
客户端查看地址:http://localhost:15672/ 默认用户名/密码 guest/guest
如果参数跟创建时选择的不一致,报错信息,例如代码这样写
启动成功时会看到消息创建成功
3.编写消费者
public class SimpleConsome {
public static void main(String[] args) throws IOException, TimeoutException {
Connection conn = ConnectionUtils.getConn();
Channel channel = conn.createChannel();
channel.queueDeclare(SimpleProduct.SIMPLE_QUEUE, true, false, false, null);
//handleDelivery父类没有实现,需要自己写
DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
System.out.println("消费消息:"+new String(body, "UTF-8"));
}
};
//声明消费者队列
//true:表示自动确认,只要消息从队列中获取,无论消费者获取到消息后是否成功消费,都会认为消息已经成功消费
//false:表示手动确认,消费者获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,
// 如果消费者一直没有反馈,那么该消息将一直处于不可用状态,并且服务器会认为该消费者已经挂掉,不会再给其
//发送消息,直到该消费者反馈。
channel.basicConsume(SimpleProduct.SIMPLE_QUEUE, true,defaultConsumer);
}
}
输出消息