RabbitMQ入门练习

RabbitMQ

      • 生产者 Produce
      • 消费者 Consumer

生产者 Produce

package rabbitmq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

public class Produce01 {
    //队列
    private static final String QUEUE = "HELLOworld";

    public static void main(String[] args){
//通过连接工厂创建新的连接个 mq 建立连接
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);//端口
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
//设置虚拟机,一个mq服务可以设置多个虚拟机,每个虚拟机就相当于一个独立的mq
        connectionFactory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;
        try {
        //建立新连接
            connection = connectionFactory.newConnection();
        //创建会话通道,生产者和mq服务所有通信都在channel通道中完成
            channel = connection.createChannel();
        //声明队列
            //参数: String queue, boolean durable, boolean exclusive, boolean autoDelete, Map arguments
            /**
             * 参数明细:
             * 1.queue: 队列名称
             * 2.durable: 是否持久化,如果持久化,mq重启后队列还在
             * 3.exclusive: 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建
             * 4.autoDelete: 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)
             * 5.arguments: 参数,可以设置一些额外的参数,比如:可以设置存活时间
             */
            channel.queueDeclare(QUEUE,true,false,false,null);
        //发送消息
            //参数:String exchange, String routingKey, BasicProperties props, byte[] body
            /**
             * 参数明细:
             * 1.exchange: 交换机,如果不指定将使用mq的默认交换机
             * 2.routingKey: 路由key,交换机根据路由key来讲消息转发到指定的队列,如果不使用默认交换机,routingKey设置为队列名称
             * 3.props: 消息属性
             * 4.body: 消息内容
             */
            //消息内容
            String message = "heaven";
            channel.basicPublish("",QUEUE,null,message.getBytes(StandardCharsets.UTF_8));
            System.out.println("Produce01.main send" + message);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                channel.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            } finally {
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

消费者 Consumer

package com.example.rabbitmq;

import com.rabbitmq.client.*;
import com.rabbitmq.client.impl.ChannelN;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class Consumer01 {
    //队列
    private static final String QUEUE = "HELLOworld";

    public static void main(String[] args) {
//通过连接工厂创建新的连接个 mq 建立连接
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);//端口
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
//设置虚拟机,一个mq服务可以设置多个虚拟机,每个虚拟机就相当于一个独立的mq
        connectionFactory.setVirtualHost("/");

        try {
            //建立新连接
            Connection connection = connectionFactory.newConnection();
            //创建会话通道,生产者和mq服务所有通信都在channel通道中完成
            Channel channel = connection.createChannel();
            //声明队列
            //参数: String queue, boolean durable, boolean exclusive, boolean autoDelete, Map arguments
            /**
             * 参数明细:
             * 1.queue: 队列名称
             * 2.durable: 是否持久化,如果持久化,mq重启后队列还在
             * 3.exclusive: 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建
             * 4.autoDelete: 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)
             * 5.arguments: 参数,可以设置一些额外的参数,比如:可以设置存活时间
             */
            channel.queueDeclare(QUEUE,true,false,false,null);

            //实现消费方法
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
                //当接收到消息后此方法将被调用
                /**
                 * @param consumerTag 消费者标签,用来标识消费者的,在监听队列是设置channel.basicConsumer
                 * @param envelope 信封,通过envelope
                 * @param properties 消息内容
                 * @param body
                 * @throws IOException
                 */
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    //交换机
                    String exchange = envelope.getExchange();
                    //消息id,mq在channel中来表示消息的id,可用于确认消息已接收
                    long deliveryTag = envelope.getDeliveryTag();
                    //消息内容
                    String message = new String(body,"UTF-8");
                    System.out.println("Consumer01.handleDelivery receive:" + message);
                }
            };

            //监听队列
            //参数:(String queue, boolean autoAck, DeliverCallback deliverCallback, CancelCallback cancelCallback, ConsumerShutdownSignalCallback shutdownSignalCallback
            /**
             * 参数明细:
             * 1.queue:队列名称
             * 2.autoAck:自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为true表示会自动回复mq,如果设置为false要通过编程实现回复
             * 3.deliverCallback:消费方法,当消费者接收到消息要执行的方法
             */
            channel.basicConsume(QUEUE,true,defaultConsumer);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
        }
    }
}

你可能感兴趣的:(rabbitmq,工作后,java,rabbitmq)