持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
RabbitMq入门 RabbitMQ网站端口号:15672
工作机制
生产者、消费者和代理
在了解消息通讯之前首先要了解3个概念:生产者、消费者和代理。
生产者:消息的创建者,负责创建和推送数据到消息服务器;
消费者:消息的接收方,用于处理数据和确认消息;
代理:就是RabbitMQ本身,用于扮演“快递”的角色,本身不生产消息,只是扮演“快递”的角色。
在mabbitmq中有7中模型,分别介绍了rabbitmq的7种工作方式,在这里只介绍前5中。
首先应该先导包。
1.“Hello World!”
在这个模型中只有三个对象,生产者,队列,消费者。这是一个最简单的模型。
provider.java
public class provider { public static void main(String[] args) throws IOException, TimeoutException { //获取连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setVirtualHost("/joviehost"); factory.setUsername("jovie"); factory.setPassword("123456"); factory.setHost("localhost"); // 获取连接 Connection connection = factory.newConnection(); // 获取通道 Channel channel = connection.createChannel(); // 定义队列 channel.queueDeclare("hello",false,false,false,null); // 发布消息到队列中 channel.basicPublish("","hello",null, "this is a message".getBytes()); // 关闭通道 channel.close(); // 关闭连接 connection.close(); } }
consumer.java
public class consumer { public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setVirtualHost("/joviehost"); factory.setUsername("jovie"); factory.setPassword("123456"); factory.setHost("localhost");
Connection connection = factory.newConnection();
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 {
String s = new String(body, "UTF-8");
System.out.println(s);
}
});
}
} 这样就可以实现第一个模型了。
接下来看一下代码:
channel.queueDeclare("hello",false,false,false,null); //第一个参数queue 为队列名称
//第二个参数durable 表示队列是否支持持久化
//第三个参数exclusive 表示只对首次声明的连接可见,并且在连接断开后自动删除
//第四个参数autodelete 是否自动删除,为true时,当所有连接都断开时将自动删除队列
//第五个参数arguments 附加参数
注意:
在rabbitmq中,没有声明durable的交换机和队列在rabbitmq重启时都将被删除。
在provider和consumer中声明队列时参数需要一致,否则consumer将无法获取消息。
channel.basicPublish("","hello",null, "this is a message".getBytes()); //第一个参数exchange 交换机名称
//第二个参数routingkey 绑定queue与exchange,在这里没有定义exchange直接填写queue的名称
//第三个参数props 附加消息
//第四个参数message 要发送的消息
注意:
需要时消息在rabbitmq宕机后保存消息(消息持久化)必须增加一些设置,而在定义队列时的持久化设置是使队列不会被删除,而队列中的消息依旧会被删除。使消息持久化应当设置props
channel.basicPublish("","hello", MessageProperties.PERSISTENT_TEXT_PLAIN, "this is a message".getBytes()); 1 channel.basicConsume("hello",true,new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String s = new String(body, "UTF-8"); System.out.println(s); } }); //第一个参数 消费队列的名称
//第二个参数 autoack:1、当 autoAck设置为true时,也就是自动确认模式,一旦消息队列将消息发送给消息消费者后,就会从内存中将这个消息删除。
//2、当autoAck设置为false时,也就是手动模式,如果此时的有一个消费者宕机,消息队列就会将这条消息继续发送给其他的消费者,这样数据在消息消费者集群的环境下,也就算是不丢失了。
//第三个参数 自定义consumer