龙空技术网

RabbitMQ工作模式-简单模式

树上得风筝 88

前言:

现在大家对“简单模式怎么写”大致比较关注,小伙伴们都需要知道一些“简单模式怎么写”的相关内容。那么小编也在网摘上收集了一些有关“简单模式怎么写””的相关内容,希望小伙伴们能喜欢,同学们一起来学习一下吧!

一、简单模式(Hello World)

官网地址:

工作流程

P:生产者,也就是发送消息的程序。

C:消费者,消费者是一个主要等待接收消息的程序

Queue:消息队列,上图中红色部分,类似一个邮箱,它本质是一个大型的消息缓存区,生产者可以将消息发送到队列,消费者可以尝试从队列中接收数据。

请注意,生产者、消费者和代理不必驻留在同一主机上;事实上,在大多数应用中它们并不这样做。应用程序也可以既是生产者又是消费者。

简单模式就是一个生产者发送消息,一个消费者消费消息,消息的消费者监听消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除。

简单工作模式的代码不在这里介绍了。上一篇《RabbitMQ入门有》介绍。

编写生产者

package com.yourui.mq;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import java.nio.charset.StandardCharsets;/** * @author : pankx * @description: * @date: 2023/8/29  19:55 */public class Producer {    private final static String QUEUE_NAME = "hello";    public static void main(String[] argv) throws Exception {        //创建工厂链接        ConnectionFactory factory = new ConnectionFactory();        //主机地址        factory.setHost("localhost");        //端口地址,不写默认为 15672        factory.setPort(5672);        //虚拟主机名称;默认为        factory.setVirtualHost("/");        //连接用户名;默认为guest        factory.setUsername("admin");        //连接密码;默认为guest        factory.setPassword("admin");        //创建链接        try (Connection connection = factory.newConnection();             //创建channel链接通道             Channel channel = connection.createChannel()) {            /**             * 声明(创建)队列             * queue      参数1:队列名称             * durable    参数2:是否定义持久化队列,当mq重启之后,数据还存在             * exclusive  参数3:是否独占本次连接             *            ① 是否独占,只能有一个消费者监听这个队列             *            ② 当connection关闭时,是否删除队列             * autoDelete 参数4:是否在不使用的时候自动删除队列,当没有consumer时,自动删除             * arguments  参数5:队列其它参数             */            channel.queueDeclare(QUEUE_NAME, false, false, false, null);            //发送消息内容            String message = "Hello World!";            /**             * 参数1:交换机名称,如果没有指定则使用默认""             * 参数2:路由key,简单模式可以传递队列名称             * 参数3:消息的其它配置信息,暂时可以不配置             * 参数4:消息主体,这里为 UTF-8 格式的字节数组,可以有效地杜绝中文乱码。             */            while(true){                channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));                //打印发送的消息                System.out.println(" [x] Sent '" + message + "'");                Thread.sleep(1000);            }        }    }}
编写消费者
package com.yourui.mq;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.DeliverCallback;import java.nio.charset.StandardCharsets;/** * @author : pankx * @description:消费者 * @date: 2023/8/29  20:06 */public class Consumer {    /** 创建队列Queue,通过信道获取队列的数据*/    private final static String QUEUE_NAME = "hello";    public static void main(String[] argv) throws Exception {        //创建工厂类        ConnectionFactory factory = new ConnectionFactory();        //设置rabbitmq主机        factory.setHost("localhost");        //端口  默认值 5672        factory.setPort(5672);        //虚拟机 默认值/        factory.setVirtualHost("/");        //用户名        factory.setUsername("admin");        //密码        factory.setPassword("admin");        //创建connection 链接        Connection connection = factory.newConnection();        //创建channel链接通道        Channel channel = connection.createChannel();        /**         * 声明(创建)队列         * queue      参数1:队列名称         * durable    参数2:是否定义持久化队列,当mq重启之后,数据还存在         * exclusive  参数3:是否独占本次连接         *            ① 是否独占,只能有一个消费者监听这个队列         *            ② 当connection关闭时,是否删除队列         * autoDelete 参数4:是否在不使用的时候自动删除队列,当没有consumer时,自动删除         * arguments  参数5:队列其它参数         */        channel.queueDeclare(QUEUE_NAME, false, false, false, null);        //等待接收消息的日志        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");        /**接收队列中数据的方法                    回调方法,当收到消息后,会自动执行该方法                    1. consumerTag:标识                    2. envelope:获取一些信息,交换机,路由key...                    3. properties:配置信息                    4. body:数据            */        DeliverCallback deliverCallback = (consumerTag, delivery) -> {            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);            //打印接收消息的日志            System.out.println(" [x] Received '" + message + "'");        };        /**参数:        1. queue:队列名称        2. autoAck:是否自动确认 ,类似咱们发短信,发送成功会收到一个确认消息(如果自动签收,会删除队列的该条消息)        3. DeliverCallback:回调对象         4、CancelCallback :中断正在执行的调度任务        */        //消费者类似一个监听程序,主要是用来监听消息        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });    }}
运行程序查看结果启动生产者

登录控制台可以查看队列名称等,在消息发送的过程中,也可以使用 RabbitMQ 的管理面板查看到消息的走势图,如下所示。队列的名称,消息消费的走势等。

启动消费者

到这利用RabbitMQ失效生产和消费Hello world的就完成了。

代码示例:

github地址:

标签: #简单模式怎么写