RabbitMQ 在不同服务之间生产以及消费队列

本文通过实例演示了如何使用RabbitMQ搭建消息队列,包括生产者和消费者的基本配置与交互流程。在SpringBoot环境下,展示了如何创建并操作队列,实现不同服务间的数据传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果还没有安装RabbitMQ,可以参考另一篇博客:https://blog.youkuaiyun.com/cwr452829537/article/details/81700738

二话不说直接进入正题,在大部分情况下,消息队列的生产者和消费者不会在同一个服务里面,那么如何实现不同服务对同一个队列的操作呢?

这里我用两个类的main方法模拟一下不同服务对同一个消息队列的操作。

我是使用的SpringBoot搭建的环境,直接在创建项目的时候,勾选RabbitMQ即可(不得不说SpringBoot是真的很方便)。

然后我们创建两个类,一个生产者类RabbitProducer,一个消费者类RabbitConsumer:

RabbitProducer.java

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import pric.cwr.model.entity.UserEntity;

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

/**
 * User: R
 * Date: 2018/10/8
 * Time: 11:24
 * Created with IntelliJ IDEA.
 */
public class RabbitProducer {
    /**
     * 队列名称
     */
    private final static String MESSAGE_QUEUE_NAME = "test-rabbit-mq";

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接连接到RabbitMQ
        ConnectionFactory factory = new ConnectionFactory();
        //设置RabbitMQ所在主机ip或者主机名
        factory.setHost("localhost");
        // 创建一个连接
        Connection connection = factory.newConnection();
        // 创建一个频道
        Channel channel = connection.createChannel();
        // 指定一个队列
        channel.queueDeclare(MESSAGE_QUEUE_NAME, false, false, false, null);
        // 发送的消息,这里是两个个对象
        UserEntity userEntity1 = new UserEntity();
        userEntity1.setUserId(1001L);
        userEntity1.setName("张三");
        UserEntity userEntity2 = new UserEntity();
        userEntity2.setUserId(1002L);
        userEntity2.setName("李四");
        // 往队列中发出一条消息,由于是一个byte[],所以意味着你可以发送任何数据
        channel.basicPublish("", MESSAGE_QUEUE_NAME, null, userEntity1.toString().getBytes());
        channel.basicPublish("", MESSAGE_QUEUE_NAME, null, userEntity2.toString().getBytes());
        // 关闭频道和连接
        channel.close();
        connection.close();
    }
}

RabbitConsumer.java

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * User: R
 * Date: 2018/10/8
 * Time: 11:45
 * Created with IntelliJ IDEA.
 */
public class RabbitConsumer {
    /**
     * 队列名称
     */
    private final static String MESSAGE_QUEUE_NAME = "test-rabbit-mq";

    public static void main(String[] args) throws IOException, TimeoutException {
        //打开连接和创建频道
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        //声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列。
        channel.queueDeclare(MESSAGE_QUEUE_NAME, false, false, false, null);
        //创建队列消费者
        Consumer consumer = new DefaultConsumer(channel) {
            //队列返回的数据会在body属性里面,可以在方法里处理数据
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("data -> " + message);
            }
        };
        //消费队列
        channel.basicConsume(MESSAGE_QUEUE_NAME, true, consumer);
    }
}

首先打开RabbitMQ服务器,然后我们启动一次消费者服务,这时候,服务会向队列中添加两条数据,打开http://localhost:15672看一下结果是否正确,

客户端显示的结果正是我们想要的,这时候再开启消费者的服务,控制台显示结果如下,

由于消费者服务是启动的一个线程,所以现在生产者服务重新向队列中生产数据也会被消费者消费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值