Rabbit Mq的简单使用

前言:小刘没事复习了下MQ并且记录了下来!

消息队列-----Rabbit Mq

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)

五种情况的消息队列

1.--HelloWorld

   最简单的工作队列模式

2.--Work queues  工作队列模式

相较于第一种----多了消费者,消费者以轮询的方式分担队列中的任务

3.--Publish/Subscribe   发布、订阅

相对于第二种多了交换机。由交换机绑定到队列中,队列同时获取该交换机发布的内容。

4.--Routing    路由模式

相较于第三种,。多了routing key..通过过不同的routing key 分发不同的内容。

5.--Topics      通配符模式

    /**

     * 通配符  . 一个字符

     *         #一个或者多个字符

     */

Hello World简单代码:

package com.example;

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

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**最简单的工作队列
 * -----第二种工作队列我没写---就是多一个消费者,已轮询的方式分担任务
 * Hello world!
 *
 */
public class ProducerDemo01
{
    private final static String QUEUE_NAME = "hello";
    public static void main( String[] args )
    {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);//接口
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
//      channel.queueDeclare------参数说明
        //String queue,           队列名称,如果mq没有该队列则自动创建
        // boolean durable,       是否持久化,关闭mq服务再次开启队列依然存在
        // boolean exclusive,     是否独自占领连接connection
        // boolean autoDelete,    自动删除-----该队列
        // Map<String, Object> arguments      -----其他参数


        // channel.basicPublish发送参数
        //String exchange, 交换机---如果不指定,将使用mq的默认交换机
        // String routingKey, 路由key--交换机根据路由key将相机转发到指定的队列,如果使用默认的交换机,routingKey设置为队列的名称
        // BasicProperties props, 消息的属性---不常用
        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
            System.out.println(" [x] Sent '" + message + "'");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
//            因为Connection和Channel都实现了java.io.Closeable。这样我们就不需要在代码中明确地关闭它们。
            //通道关闭
            try {
                channel.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
            //连接关闭
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

消费者:

package com.example;

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

/**-----也是工作队列模式
 * Hello world!
 *
 */
public class ConsumeDemo01
{
    private final static String QUEUE_NAME = "hello";
    public static void main( String[] args )
    {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);//接口
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection =null;
        Channel channel=null;
        try {
            connection= factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(" [x] Received '" + message + "'");
            };
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
            //String queue, -----------队列
            // boolean autoAck, -------自动回复mq,告诉他已经接受。
            // DeliverCallback deliverCallback,------消费方法
            // CancelCallback cancelCallback
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //消费者方通道不用关闭,需要保持持久化
        }
    }
}

温馨提示:其他模式,不再多写,无非是交换机,路由key,等参数的修改。请注重灵活运用。

如有不解,请加java爱好群大家交流:852665736;群里都是热心好客的小伙伴,大家一同进步。

无偿免费分享源码以及技术和面试文档,更多优秀精致的源码技术栈分享请关注微信公众号:gh_817962068649 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值