RabbitMQ入门级别使用及其配置——小布

110 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

冰冷.jpg

RabbitMq入门 RabbitMQ网站端口号:15672

工作机制

生产者、消费者和代理

在了解消息通讯之前首先要了解3个概念:生产者、消费者和代理。

生产者:消息的创建者,负责创建和推送数据到消息服务器;

消费者:消息的接收方,用于处理数据和确认消息;

代理:就是RabbitMQ本身,用于扮演“快递”的角色,本身不生产消息,只是扮演“快递”的角色。

在mabbitmq中有7中模型,分别介绍了rabbitmq的7种工作方式,在这里只介绍前5中。

首先应该先导包。

1.“Hello World!”

image.png

在这个模型中只有三个对象,生产者,队列,消费者。这是一个最简单的模型。

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