rabbitmq安装、基本使用

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management

docker会自己下载,然后运行

进入docker:

docker exec -it rabbitmq bash

进入容器,重启rabbitmq:rabbitmq-server restart

感觉所有的消息队列都差不多,都是创建,连接,发消息,获得消息

package com.quxiao;

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

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

/**
 * @program: springboot
 * @author: quxiao
 * @create: 2023-10-29 09:39
 **/
public class t1 {

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("123");
        factory.setPassword("123");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //连接
            connection = factory.newConnection("生产者1");
            //通道
            channel = connection.createChannel();
            channel.queueDeclare("duilie1", false, false, false, null);
            channel.basicPublish("", "duilie1", null, "队列消息".getBytes());

        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            throw new RuntimeException(e);
        } finally {
            channel.close();
            connection.close();
        }
    }
}

 消费:

package com.quxiao;

import com.rabbitmq.client.*;

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

/**
 * @program: springboot
 * @author: quxiao
 * @create: 2023-10-29 10:11
 **/
public class t2 {

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("123");
        factory.setPassword("123");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //连接
            connection = factory.newConnection("生产者1");
            //通道
            channel = connection.createChannel();
//            channel.queueDeclare("duilie1", false, false, false, null);
//            channel.basicPublish("", "duilie1", null, "队列消息".getBytes());
            channel.basicConsume("duilie1", true, new DeliverCallback() {
                @Override
                public void handle(String consumerTag, Delivery message) throws IOException {
                    System.out.println(new String(message.getBody(), "UTF-8"));
                }
            }, new CancelCallback() {
                @Override
                public void handle(String consumerTag) throws IOException {
                    System.out.println("接收消息失败");
                }
            });
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            throw new RuntimeException(e);
        } finally {
            channel.close();
            connection.close();
        }
    }
}

路由分组模式:

定义路由key,将队列绑定,发送到路由key,就会发到被绑定的所有队列。 

package com.quxiao;

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

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

/**
 * @program: springboot
 * @author: quxiao
 * @create: 2023-10-29 09:39
 **/
public class t1 {

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127");
        factory.setPort(5672);
        factory.setUsername("123");
        factory.setPassword("123");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //连接
            connection = factory.newConnection("生产者1");
            //通道
            channel = connection.createChannel();
//            channel.queueDeclare("", false, false, false, null);
            channel.basicPublish("amq.direct", "type2", null, "队列消息".getBytes());
//21
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            throw new RuntimeException(e);
        } finally {
            channel.close();
            connection.close();
        }
    }
}

rebbitmq默认是一个公平的消费,即AB两个消费者,交换着取消息(上面的消费者默认就是)。

也可以设置为手动取,谁快谁用:

package com.quxiao;

import com.rabbitmq.client.*;

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

/**
 * @program: springboot
 * @author: quxiao
 * @create: 2023-10-31 14:59
 **/
public class t3 {
    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("123");
        factory.setPassword("123");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //连接
            connection = factory.newConnection("消费者2");
            //通道
            channel = connection.createChannel();
//            channel.queueDeclare("duilie1", false, false, false, null);
//            channel.basicPublish("", "duilie1", null, "队列消息".getBytes());
            Channel finalChannel = channel;
//每次取多少条消息
            finalChannel.basicQos(1);
            channel.basicConsume("duilie1", false, new DeliverCallback() {
                @Override
                public void handle(String consumerTag, Delivery message) throws IOException {
                    System.out.println(new String(message.getBody(), "UTF-8"));
//手动消费                    
finalChannel.basicAck(message.getEnvelope().getDeliveryTag(), false);
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }, new CancelCallback() {
                @Override
                public void handle(String consumerTag) throws IOException {
                    System.out.println("接收消息失败");
                }
            });
            System.in.read();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            throw new RuntimeException(e);
        } finally {
            channel.close();
            connection.close();
        }
    }
}

Docker是一种容器化平台,可以轻松地部署和管理应用程序。RabbitMQ是一个开源的消息队列系统,用于实现应用程序之间的异步通信。下面是安装使用Docker中RabbitMQ基本步骤: 1. 首先,确保已经安装了Docker和Docker Compose。可以在官方网站上找到适合你操作系统的安装指南。 2. 创建一个新的目录,并在其中创建一个名为`docker-compose.yml`的文件。 3. 在`docker-compose.yml`文件中,添加以下内容: ``` version: '3' services: rabbitmq: image: rabbitmq:management ports: - 5672:5672 - 15672:15672 volumes: - ./data:/var/lib/rabbitmq environment: RABBITMQ_DEFAULT_USER: your_username RABBITMQ_DEFAULT_PASS: your_password ``` 这个配置文件使用RabbitMQ的官方镜像,并启用了RabbitMQ管理插件。它还将容器内部的5672和15672端口映射到主机上,用于AMQP协议和管理界面的访问。 4. 将`your_username`和`your_password`替换为你自己的用户名和密码。 5. 在终端中,导航到包含`docker-compose.yml`文件的目录,并执行以下命令启动RabbitMQ容器: ``` docker-compose up -d ``` 这将会下载RabbitMQ镜像并启动容器。使用`-d`参数可以在后台运行容器。 6. 等待一段时间,直到容器启动完毕。你可以使用以下命令检查容器的状态: ``` docker-compose ps ``` 如果一切顺利,你应该看到一个名为`rabbitmq`的容器正在运行。 7. 现在,你可以通过访问`http://localhost:15672`来打开RabbitMQ管理界面。使用之前设置的用户名和密码进行登录。 从这里开始,你可以创建队列、交换机和绑定,并发送和接收消息。具体的RabbitMQ使用方法可以参考官方文档。 希望这个简单的指南对你有帮助!如果你有任何疑问,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值