首页 > 其他分享 >RabbitMQ 学习笔记 - 2

RabbitMQ 学习笔记 - 2

时间:2024-02-19 22:33:37浏览次数:28  
标签:rabbitmq 学习 client 线程 笔记 import RabbitMQ com channel

Work Queues

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。

3.1 轮询分发消息

该 demo 中一个线程发消息,两个工作线程处理消息

抽取获取连接的工具类

package com.kwin.rabbitmq.utils;

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

public class RabbitMqUtils {
    //得到一个连接的 channel
    public static Channel getChannel() throws Exception {
        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("119.91.219.72");
        factory.setUsername("admin");
        factory.setPassword("a123456");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        return channel;
    }
}

启动两个工作线程

package com.kwin.rabbitmq.two;

import com.kwin.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;

import java.sql.DriverManager;

public class Worker01 {

    //队列名称
    private static final String QUEUE_NAME = "hello1";

    //消息消费的方法
    private static void consumeMessage(String threadName) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();

        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println(threadName + ",接收到消息:" + new String(message.getBody()));
        };

        CancelCallback cancelCallback = consumerTag -> {
            System.out.println(threadName + ",消息消费被中断");
        };

        System.out.println(threadName + "启动,等待消费......");

        channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
    }

    public static void main(String[] args) {
        
        for (int i = 1; i <= 2; i++) {
            new Thread(()->{
                try {
                    consumeMessage(Thread.currentThread().getName());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, "工作线程" + i).start();
        }
        
    }
}

启动一个发送线程

package com.kwin.rabbitmq.two;

import com.kwin.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.Channel;

import java.util.Scanner;

public class Task01 {

    //队列名称
    private static final String QUEUE_NAME = "hello1";

    public static void main(String[] args) throws Exception {

        Channel channel = RabbitMqUtils.getChannel();

        /**
         * 生成一个队列
         * 1.队列名称
         * 2.队列里面的消息是否持久化(磁盘) 默认情况下存储在内存中
         * 3.该队列是否只供一个消费者进行消费,是否可以消息共享,true可以多个消费者消费, false只能一个消费者消费
         * 4.是否自动删除 最后一个消费者断开连接之后,该队列是否自动删除 true自动删除 false不自动删除
         * 5.其他参数
         */
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String message = scanner.next();
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println("消息发送完成:" + message);
        }
    }
}

测试

先启动两个工作线程

 启动消息发送的线程,控制台输入AA、BB、CC…

 查看工作线程日志

 

标签:rabbitmq,学习,client,线程,笔记,import,RabbitMQ,com,channel
From: https://www.cnblogs.com/otf-notes/p/18022084

相关文章

  • 2.19 闲话 & 学习笔记 『 望向这片懵懂的土地/嘈杂念想充斥着思绪 』
    昨天没发闲话,今天事情太乱来不及写学术内容放昨天的学术内容吧今天去面试,感觉说的跟个......
  • Go语言精进之路读书笔记第29条——使用接口作为程序水平组合的连接点
    如果说C++和Java是关于类型层次结构和类型分类的语言,那么Go则是关于组合的语言。——RobPike,Go语言之父“偏好组合,正交解耦”29.1一切皆组合在语言设计层面,Go提供了诸多正交的语法元素供后续组合使用,包括:Go语言无类型体系(typehierarchy),类型定义独立;方法和类型是正交......
  • 数学专题集训笔记
    感谢lsy学长来101给我们上课~Day1逆元对于一个\(a\),当\(ab\equiv1\pmod{m}\)时我们把\(b\)的最小整数解称作\(a\)模\(m\)的逆元,记作\(a^{-1}\)或\(\frac{1}{a}\)。接下来我们来看看逆元的求法。费尔马小定理如果\(a\)是一个整数,\(p\)是一个质数,则有\[a^p\e......
  • 读书笔记3
    第三章软件工程师的成长这章主要讨论软件工程师个人能力衡量及发展,一些思维误区和以后的职业发展在团队工作中,稳定、一致的交付时间时衡量一个员工能力的重要方面初级软件工程师的成长包括以下几种:(1)积累软件开发相关的知识,提升技术技能(如对具体技术的掌握,动手能力)。例如:对JAV......
  • FOI2023 冬令营笔记
    Day1基础算法:二分:求解满足\(x\)条件的最小\(y\)值\(\Rightarrow\)二分一个答案\(y\),判断\(y\)是否满足\(x\)条件时间复杂度:log二分答案,暴力地判断标志:最小xx的最大值/最大xx的最小值贪心:思考顺序:分治:对于一个问题,把它分解成两个大小相等的子问题,通过log层......
  • 【深度学习】神经网络的建立与推理
    目录神经网络(neuralnetwork)的结构神经元中常用的激活函数(activationfunction)神经网络的表示神经网络的代码实现使用已学习完毕的神经网络进行推理(inference)源代码文件请点击此处!神经网络(neuralnetwork)的结构输入层(inputlayer):第0层(layer0)隐藏层(hiddenlayer):第1层(lay......
  • 启动和停止RabbitMQ
    以下是在Ubuntu上启动和停止RabbitMQ的完整命令:启动RabbitMQ打开终端并输入以下命令以启动RabbitMQ服务:sudosystemctlstartrabbitmq-server检查RabbitMQ服务是否正在运行:sudosystemctlstatusrabbitmq-server如果RabbitMQ服务正在运行,您应该看到“active(runni......
  • 算法学习笔记(45): 快速沃尔什变换 FWT
    遗憾的是math里面一直没有很好的讲这个东西……所以这次细致说说。FWT的本质类似于多项式卷积中,利用ntt变换使得卷积\(\to\)点乘,fwt也是类似的应用。定义某种位运算\(\oplus\),那么fwt处理的位运算卷积形如:\[H=F*G\impliesH_k=\sum_{i\oplusj=k}F_iG_......
  • 【FLINK学习笔记】 FLINK WINDOW(窗口)详解
    【FLINK学习笔记】FLINKWINDOW(窗口)详解一、Window分类GlobalWindow和和KeyedWindow在运用窗口计算时,Flink根据上游数据集是否为KeyedStream类型,对应的Windows也会有所不同。KeyedWindow:上游数据集如果是KeyedStream类型,则调用DataStreamAPI的window()方......
  • Rabbitmq
    Rabbitmq官网:https://rabbitmq.com/install-homebrew.html安装brewinstallrabbitmq#查看版本信息,及安装位置brewinforabbitmq#配置环境变量open-e~/.zshrc#添加如下内容exportPATH=/opt/homebrew/Cellar/rabbitmq/3.12.13/sbin:$PATHrabbitmq命令#启动服......