1.消息队列的作用,以及准备工作

1.1. 为什么要用 MQ

1.2.rabbitMQ在linux下的常用命令

1.添加开机启动 RabbitMQ 服务 chkconfig rabbitmq-server on 2.启动服务 /sbin/service rabbitmq-server start 3.查看服务状态 /sbin/service rabbitmq-server status 4.停止服务(选择执行) /sbin/service rabbitmq-server stop 5.开启 web 管理插件 rabbitmq-plugins enable rabbitmq_management 用默认账号密码(guest)访问地址 http://192.168.121.111:15672/出现权限问题 6.添加一个新的用户 创建账号 rabbitmqctl add_user admin 123

admin 123代表账号和密码(自己设置) 7.设置用户角色 rabbitmqctl set_user_tags admin administrator 8.设置用户权限 rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限

9.当前用户和角色

rabbitmqctl list_users

2.简单的代码整合

2.1用Java代码进行操作

P代表一个生产者,C代表一个消费者 ,生产者负责将消费者传递给消费者




springboot rabbitmq 发送多种队列 rabbitmq队列消息数量_消息队列


下面引入非SpringBoot整合的依赖包(后边会有整合SpringBoot的包)

<!--指定 jdk 编译版本-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <!--rabbitmq 依赖客户端-->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.8.0</version>
        </dependency>
        <!--操作文件流的一个依赖-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

生产者代码

/**
 * 生产者:发消息
 */
public class Producer {
    //队列
    public static final String QUEUE_NAME="hello";

    //
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建一个连接工厂
        ConnectionFactory factory=new ConnectionFactory();
        //设置连接工场ip,连接rabbitMQ的队列
        factory.setHost("192.168.121.111");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("123");
        //创建连接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();
        /**
         * 生成一个队列
         * 1.队列名称
         * 2.队列里面的消息是否持久化 默认情况 消息存储在内存中
         * 3.该队列是否只供一个消费者进行消息共享,true:可以多个,false:一个
         * 4.是否自动删除,最后一个消费者开连接后该队列是否自动删除,true:自动,false:则相反
         */
        Map<String,Object> arguments=new HashMap<>();
        arguments.put("x-max-priority",10);//官方允许是在0-255,允许优先级的范围0-10
        channel.queueDeclare(QUEUE_NAME,false,false,false,arguments);
        //发消息
        String message="hello world";
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        /**
         * 发送一个消息
         * 1.发送到哪个交换机
         * 2.路由的key值是哪个,本次是队列的名称
         * 3.其他参数信息
         * 4.发送的消息的消息体
         */
        System.out.println("消息发送完毕");

    }

}

消费者代码

/**
 * 消费者 接受消息的
 */

public class Consumer {
    //队列名称
    public static final String QUEUE_NAME="hello";

    //接收消息
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置连接工场ip,连接rabbitMQ的队列
        factory.setHost("192.168.121.111");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("123");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        //声明
        DeliverCallback deliverCallback=(String var1, Delivery var2)->{
            System.out.println(new String(var2.getBody()));
        };
        //取消消息时的回调
        CancelCallback cancelCallback=consumerTag->{
            System.out.println("消息消费被中断");
        };
        /**
         * 消费者消费消息
         * 1.消费哪个队列
         * 2.消费成功后是否自动应答 true 代表的是自动应答,false代表的是手动应答
         * 3.消费者未成功消费的回调
         * 4.消费者取消消费的回调
         */
        channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
    }

}

这样就实现了一个简单的工作队列