消息队列(三)——RabbitMQ入门案例

入门案例

在这里插入图片描述
一、生产者
依赖:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.6.0</version>
</dependency>

Producer

/**
 * @Author: jinv
 * @CreateTime: 2020-06-10 17:49
 * @Description: 生产者
 */
public class Producer {
    private static String queueName = "itheima";

    public static void main(String[] args) throws Exception {
        //1.创建一个ConnectionFactory并进行配置
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("39.97.123.123");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");//默认为guest
        connectionFactory.setPassword("admin");//默认为guest
        connectionFactory.setVirtualHost("my_vhost");//默认为/
        connectionFactory.setHandshakeTimeout(20000);
        //2.通过链接工厂创建连接
        Connection connection = connectionFactory.newConnection();

        //3.通过Connection创建一个Channel
        Channel channel = connection.createChannel();

        /**
         * 参数一:队列名称
         * 参数二:是否定义持久化队列
         * 参数三:是否独占本次连接
         * 参数四:会否在不使用的时候自动删除队列
         * 参数五:队列其他参数
         */
        channel.queueDeclare(queueName,true,false,false,null);

        //4.通过Channel发送数据
        for (int i = 0;i<5;i++){
            System.out.println("生产消息"+i);
            String msg = "Hello rabbitMQ"+i;
            channel.basicPublish("",queueName,null,msg.getBytes());
        }

        //关闭连接
        channel.close();
        connection.close();

    }


}

在这里插入图片描述
可以点击itheima这个队列查看接收到的生产消息
在这里插入图片描述
因为没有消费者,所以这些消息没有背删除而是缓存在队列里

二、消费者
依赖同上
ConnectionUtils:返回一个rabbitMQ连接

/**
 * @Author: jinv
 * @CreateTime: 2020-06-10 22:16
 * @Description: rabbitMQ连接工具类
 */
public class ConnectionUtils {
    public static Connection getConnection() throws Exception {
        //创建连接工厂
        ConnectionFactory connectionFactory =new ConnectionFactory();
        //主机地址:默认localhost
        connectionFactory.setHost("39.97.123.123");
        //连接端口:默认5672
        connectionFactory.setPort(5672);
        //虚拟主机名称:默认/
        connectionFactory.setVirtualHost("my_vhost");
        //连接用户名,默认guest
        connectionFactory.setUsername("admin");
        //连接密码,默认guest
        connectionFactory.setPassword("admin");

        return connectionFactory.newConnection();
    }

}

Consumer

/**
 * @Author: jinv
 * @CreateTime: 2020-06-10 22:11
 * @Description: 消费者
 */
public class Consumer {
    public static void main(String[] args) throws Exception {
        //获取连接
        Connection connection = ConnectionUtils.getConnection();
        //创建频道
        Channel channel  =connection.createChannel();
        //创建队列,并设置消息处理
        channel.queueDeclare(Producer.queueName,true,false,false,null);
        //监听消息
        DefaultConsumer consumer = new DefaultConsumer(channel){
            /**
             *
             * @param consumerTag:消息标签,在channel.basicConsume时候可以指定
             * @param envelope:消息包内容,可以从中取消息id,消息routingkey,交换机,消息和重转标记(收到消息失败后是否需要重新发送)
             * @param properties:消息属性
             * @param body:消息
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("路由key为:"+envelope.getRoutingKey());
                System.out.println("交换机为:"+envelope.getExchange());
                System.out.println("消息id为:"+envelope.getDeliveryTag());
                //收到的消息
                System.out.println("接收到的消息为:"+new String(body,"UTF-8"));
                System.out.println();
                System.out.println("=====================================================");
                System.out.println();
            }
        };


        /**
         * 监听消息
         * 参数一:队列名称
         * 参数二:是否自动确认。设置为true表示消息接收到自动向mq回复收到了,mq接收到回复后会删除消息,设置为false则需要手动确认
         */
        channel.basicConsume(Producer.queueName,true,consumer);


        //不关闭链接,应该一直坚挺消息
    }

}

注意消费者监听队列是不关闭流的

在这里插入图片描述
生产者再生产消息,消费者也能监听到,并且队列缓存会删除被消费者消费了的消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值