【RabbitMQ】Java操作RabbitMQ之入门Demo

12 篇文章 1 订阅

目录

一、项目创建

二、生产者

三、消费者

一、项目创建

我们先在idea里创建两个Maven项目一个项目作为生产者,另一个作为消费者。创建完成后,在各自的pom.xml文件里引入Java使用RabbitMQ的依赖

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

然后在对应的项目里创建 消费者类与生产者类

二、生产者

由之前文章里我们了解到RabbitMQ的通信如下图,我们要想将生产者生产的消息存入队列,我们就一个先获得Connection(连接)然后通过连接获取到channel,然后选择虚拟机交换机以及队列等最后关闭连接【RabbitMQ】RabbitMQ的简介_1373i的博客-CSDN博客icon-default.png?t=N2N8https://blog.csdn.net/qq_61903414/article/details/130139970?spm=1001.2014.3001.5501

 我们获取连接是通过连接工厂进行获取的所以此时我们先要去创建连接工厂并给他配置相应的信息

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

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

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");
    }
}

此时我们可以通过连接工厂获取到连接connection,然后获取到channel

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

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

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
    }
}

此时我们需要去在MQ里创建队列,通过channel里的queueDelclare方法来创建该方法有以下参数

参数说明
queue要创建队列的名称
durable该队列里的消息是否持久化
exclusive1》是否只允许一个消费者监听消费2》当连接关闭时是否销毁该队列
autoDelete没有consumer是否自动删除
arguments在后续文章里会详细讲到
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

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

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建队列
        channel.queueDeclare("EmailQueue",true,false,false,null);
    }
}

此时我们就可以通过channel里的basicPublish方法进行发送消息,该方法有以下参数

参数说明
exchange交换机(后续详细讲到,此处使用默认交换机)
routingKey路由名称(后续讲到,由于此处使用默认交换机所以路由名称为队列名)
props相关的配置信息
body要发送的消息
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

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

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建队列
        channel.queueDeclare("EmailQueue",true,false,false,null);

        // 4.发送消息
        channel.basicPublish("","EmailQueue",null,"hello mq".getBytes());
        
        // 5.关闭连接
        channel.close();
        connection.close();
    }
}

 发送完成后关闭连接即可,运行程序后此时mq队列里存在了一条消息

 

三、消费者

在实现消费者时,我们也需要先建立连接所以前个步骤与生产者相同

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

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

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

    }
}

此时建立连接后我们通过basicConsume该方法进行获取消息,参数如下

参数说明
queue从哪个队列获取消息
autoAck获取到信息后是否自动给MQ服务器发送确认收到
callback收到消息后的回调对象,需要手动实现
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

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

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.获取消息
        channel.basicConsume("EmailQueue",true,consumer);
    }
}

我们此时还需要去手动实现回调对象,通过匿名内部类实现回调对象的回调方法

import com.rabbitmq.client.*;
import com.rabbitmq.client.Consumer;

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

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.获取消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法 收到信息后自动执行该方法
             * @param consumerTag 消息唯一标识
             * @param envelope    获取信息
             * @param properties  获取配置信息
             * @param body        消息
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag :" + consumerTag);
                System.out.println("exchange :" + envelope.getExchange());
                System.out.println("routingKey ;" + envelope.getRoutingKey());
                System.out.println("properties :"+ properties);
                System.out.println("consumer 消费消息 :" + new String(body));
            }
        };
        channel.basicConsume("EmailQueue",true,consumer);
    }
}

运行代码此时就可以获得存入的消息

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这里是一个 RabbitMQJava demo,使用 RabbitMQJava 客户端编写。 首先,需要在项目中引入 RabbitMQJava 客户端依赖,可以在 pom.xml 文件中加入以下内容: ```xml <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.12.0</version> </dependency> ``` 然后,我们需要编写两个类,一个用于发送消息,一个用于接收消息。 发送消息的类: ```java import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); } } } ``` 接收消息的类: ```java import com.rabbitmq.client.*; import java.io.IOException; public class Recv { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel 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 -> { }); } } ``` 运行接收消息的类后,再运行发送消息的类,就可以在控制台看到接收到的消息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1886i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值