Java使用rabbitmq

118 阅读2分钟

项目搭建

参考尚硅谷视频www.bilibili.com/video/BV1cb…

像创建一个空项目 充当父项目

在创建一个maven module ,在module中导入依赖

<!--指定 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>

image.png

有这两个东西就算搭建好了

image.png

生产者创建

public class producer {
    // 队列名称
    public static final String QUEUE_NAME="hello";
    // 发消息
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建一个连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();

        // 设置连接参数
        //工厂ip连接RabbitMQ的队列  这里我使用的虚拟ip
        connectionFactory.setHost("xxxxx");
        //用户名
        connectionFactory.setUsername("xxxx");
        //密码
        connectionFactory.setPassword("xxxx");

        //创建连接
        Connection connection = connectionFactory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();
        /**
         * 生产一个队列
         * 第一个参数 队列名称
         * 第二个参数 队列中的消息是否持久化(磁盘中) 默认消息存储在内存中
         * 第三个参数 该队列是否只供一个消费者进行消息共享,true可以多个消费者 false反之
         * 第四个参数 是否自动删除 true 表示自动删除
         * 第五个参数  其他参数 延迟 死信队列等
         */
       channel.queueDeclare(QUEUE_NAME, false, false, false,null);

       // 发送消息
       String message="hello world";
        /**
         * 发送一个消息
         *参数
         * 1 发送到哪个交换机
         * 2 路由的key值是哪个,本次是队列名称
         * 3 其他参数信息
         * 4 发送消息的消息体
         */

       channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        System.out.println("================消息发送完毕========================");

    }
}

运行时出现了两个问题 一个是需要 sl4j 的依赖(其实不影响)

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
</dependency>

还有一个时之前的视频没有讲到要开放5672端口 连接超时

消费者创建

    // 接收消息
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建一个连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();

        // 设置连接参数
        //工厂ip连接RabbitMQ的队列
        connectionFactory.setHost("xxxxx");
        //用户名
        connectionFactory.setUsername("xxxxx");
        //密码
        connectionFactory.setPassword("xxxxx");

        Connection connection = connectionFactory.newConnection();

        //获取信道
        Channel channel = connection.createChannel();

        //声明 接收消息
        DeliverCallback deliverCallback =(var1,var2)->{
            //打印消息体
            System.out.println(new String(var2.getBody()));
        };
        //取消消息的回调
        CancelCallback cancelCallback = var1->{
            System.out.println("xiaoxi xiaofei bei zhongduan ");
        };

        /**消费者消费信息
         * 参数
         * 1 消费哪个队列
         * 2 消费成功之后是否自动应答 true代表自动应答 false代表手动应答
         * 3 消费者未成功消费的回调
         * 4 消费者取消消费的回调
         */
         channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);

    }
}