RabbitMQ的基本使用

基本使用

使用maven工程来演示,需要导入依赖包

<dependencies>
        <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.1.1</version>
        </dependency>
    </dependencies>
创建队列函数参数说明:
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                 Map<String, Object> arguments) throws IOException;
参数含义
queue队列名取值任意
durable是否为持久化的队列
exclusive是否排外,如果排这个队列只允许一个消费者监听
autoDelete是否自动删除,如果为True则表示当队列中没有消息,也没有消费者来连接时就会自动删除该队列
arguments队列的一些属性设置,通常为null

注意:创建队列的时候如果该队列存在则放弃创建,即不会将原有的队列中的消息覆盖掉。如果该队列存在可以不调用该函数。。如果队列不存在则必须创建队列。

发送消息函数参数说明:
void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException;
参数含义
exchange交换机名称,为空字符串表示不使用交换机
routingKey队列名或routingKey,当指定交换机后这个值就是routingKey
props消息的属性消息,通常为null即可
body消息体的字节数组

案例

注意:使用Java程序连接RabbitMQ的时候的端口是5672

发送方:
public class Send {
    public static void main(String[] args) {
        /**创建连接工厂
         * */
        ConnectionFactory factory =new ConnectionFactory();

        /**RabbitMQ的连接消息
         * */
        factory.setHost("192.168.79.140");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("123456");

        /**定义连接
         * */
        Connection connection=null;
        /**定义通道
         * */
        Channel channel=null;
        try {
            /**获取连接
             * */
            connection=factory.newConnection();
            /**获取通道
             * */
            channel=connection.createChannel();

            /**创建队列
             * */
            channel.queueDeclare("myQueue",true,
                    false,false,null);
            /**定义消息
             * */
            String message="RabbitMQ的测试消息";
            /**通过通道发送消息
             * */
            channel.basicPublish("",
                    "myQueue",null,message.getBytes("utf-8"));
            System.out.println("发送消息成功");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }finally {
            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();
                }
            }
        }
    }
}

注意:finally中必须先关闭通道channel在关闭connection。否则会抛出异常。

执行结果:

在这里插入图片描述

注意:当管控台中的Requeue为Yes时,永远只获取到队头的消息。即不会进行出队操作。

接受方:

由于接受的回调函数有多个重载,这使用的是四个参数的

接受消息函数说明:
String basicConsume(String queue, boolean autoAck, DeliverCallback deliverCallback, CancelCallback cancelCallback) throws IOException;
参数含义
queue当前消费者监听的队列名
autoAck消息是否自动确认,true表示自动确认接受完消息后会自动将消息从队列中删除
deliverCallback消息消费者的标签,用于多个消费者监听同一个队列时确认不同的消费者。通常为空字符串即可
cancelCallback消息接受的回调函数,这个函数具体完成对消息的处理代码
public class Reseive {
    public static void main(String[] args) {
        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("192.168.79.140");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("123456");
        /**通道资源和连接资源不需要关闭
         * 关闭小概率会抛出异常
         * */
        Connection connection=null;
        Channel channel=null;
        try {
            connection=factory.newConnection();
            channel=connection.createChannel();

            channel.queueDeclare("myQueue",
                    true,false,false,null);
            channel.basicConsume("myQueue",true,"",
                    new DefaultConsumer(channel){
                        /**消息的具体接受和处理函数
                         * */
                        @Override
                        public void handleDelivery(String consumerTag,
                                                   Envelope envelope,
                                                   AMQP.BasicProperties properties,
                                                     byte[] body) throws IOException {
                            String message=new String(body,"utf-8");
                            System.out.println(message);
                        }
                    });
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}

注意:当使用了basicConsume()函数后,会启动一个线程来不间断的监听队列,如果队列中有消息就会自动接受消息。因此不能关闭连接和通道对象。如果关闭连接和通道对象可能会接受不到消息或者抛出异常。

执行结果:

在这里插入图片描述

如果队列里在没有监听该队列时堆积了很多消息,那么消费者监听的时候就会一次性获取队列中的所有消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值