RabbIT

SpringBoot整合多个RabbitMQ

家住魔仙堡 提交于 2020-08-16 08:19:21
一、背景 ​ 最近项目中需要用到了 RabbitMQ 来监听消息队列,监听的消息队列的 虚拟主机( virtualHost )和队列名( queueName )是不一致的,但是接收到的消息格式相同的。而且可能还存在程序不停机的情况下,动态的增加新的队列( queue )的监听,因此就需要我们自己在程序中实现一种方法实现动态配置 RabbitMQ 。 二、需求 我们有 2 个 RabbitMQ 的配置,在程序启动的时候,动态的配置好这2个 RabbitMQ ,实现消息的监听。 RabbitMQ 的配置信息 host port username password virtualHost queueName 47.101.130.164 5672 rabbit-multi-01 rabbit-multi-01 /rabbit-multi-01 queue-rabbit-multi-01 47.101.130.164 5672 rabbit-multi-02 rabbit-multi-02 /rabbit-multi-02 queue-rabbit-multi-02 三、实现思路 1、动态配置RabbitMQ 包括 ConnectionFactory , RabbitAdmin , RabbitTemplate , SimpleMessageListenerContainer 等 2

Java基础系列——分支结构、循环结构的练习(09)

这一生的挚爱 提交于 2020-08-14 22:30:02
关于分支结构与循环结构的练习,注意,并不一定时最优解,如果有更好的程序,请在评论中指出。 这里仅仅是少量,题目有大量的选择,有兴趣的可以去 牛客网 进行训练。 实现对三个整数进行排序,输出时按照从小到大的顺序输出 import java.util.Scanner; /** * @ClassName Exercise1 * @Description 实现对三个整数进行排序,输出时按照从小到大的顺序输出 * @Author lujiapeng **/ public class Exercise1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("a="); int a = input.nextInt(); System.out.print("b="); int b = input.nextInt(); System.out.print("c="); int c = input.nextInt(); int temp; if (a > b) { temp = a; a = b; b = temp; } if (a > c) { temp = a; a = c; c = temp; } if (b > c) { temp = b; b =

RabbitMQ:消息发送确认 与 消息接收确认(ACK)

倾然丶 夕夏残阳落幕 提交于 2020-08-14 11:49:07
默认情况下如果一个 Message 被消费者所正确接收则会被从 Queue 中移除 如果一个 Queue 没被任何消费者订阅,那么这个 Queue 中的消息会被 Cache(缓存),当有消费者订阅时则会立即发送,当 Message 被消费者正确接收时,就会被从 Queue 中移除 消息发送确认 发送的消息怎么样才算失败或成功?如何确认? 当消息无法路由到队列时,确认消息路由失败。消息成功路由时,当需要发送的队列都发送成功后,进行确认消息,对于持久化队列意味着写入磁盘,对于镜像队列意味着所有镜像接收成功 消息接收确认 消息消费者如何通知 Rabbit 消息消费成功? 消息 通过 ACK 确认是否被正确接收 ,每个 Message 都要被确认(acknowledged),可以手动去 ACK 或自动 ACK 自动确认会在消息发送给消费者后立即确认,但存在丢失消息的可能,如果消费端消费逻辑抛出异常,也就是消费端没有处理成功这条消息,那么就相当于丢失了消息 如果消息已经被处理,但后续代码抛出异常,使用 Spring 进行管理的话消费端业务逻辑会进行回滚,这也同样造成了实际意义的消息丢失 如果手动确认则当消费者调用 ack、nack、reject 几种方法进行确认,手动确认可以在业务失败后进行一些操作,如果消息未被 ACK 则会发送到下一个消费者 如果某个服务忘记 ACK 了,则

介绍Spring Cloud Stream与RabbitMQ集成

a 夏天 提交于 2020-08-12 01:43:15
一. 首先安装rabbitmq-management 这里用的是rabbitmq的docker镜像,我们可以在 Docker Hub 中搜索rabbitmq, 找到最新的版本安装 sudo docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3.7.8-management 安装之后使用 docker ps -a 检查下, rabbitmq的镜像是否启动, 正常启动状态如下: 通过 http://192.168.12.12:15672 , 访问到rabbitmq的管理端, 默认账户/密码是: guest/guest 二. Spring Cloud Stream与RabbitMQ集成 引入依赖 <!-- Spring Cloud Stream RabbitMQ --> < dependency > < groupId > org.springframework.cloud </ groupId > < artifactId > spring-cloud-starter-stream-rabbit </ artifactId > </ dependency > 创建消息接受类 @Component @Slf4j @EnableBinding ( Processor .

部署rabbitMQ镜像集群实战测试

南楼画角 提交于 2020-08-11 16:49:58
部署rabbitMQ镜像集群 版本信息 rabbit MQ: 3.8.5 Erlang: 官方建议最低21.3 推荐22.x 这里用的是23 环境准备 主机规划 主机 节点 172.16.14.3 磁盘节点 172.16.14.4 内存节点 172.16.14.5 磁盘节点 内存节点: 内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。例外情况是:持久的 queue 的内容将被保存到磁盘。 磁盘节点: 将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。 注意点: 1、内存节点由于不进行磁盘读写,它的性能比磁盘节点高。 2、集群中可以存在多个磁盘节点,磁盘节点越多整个集群可用性越好,但是集群整体性能不会线性增加,需要权衡考虑。 3、RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。 4、设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。 下载离线包 官网安装手册( https://www.rabbitmq.com/install

学习rabbitmq (二) 使用rabbitmq <完结>

大城市里の小女人 提交于 2020-08-11 02:33:31
以为rabbitmq会折腾很久,但没有想到就这么多点内容,主要是服务端的懒得去折腾,比如docker的转移啊,发布啊,部署啥的 今天写了一些代码,用的c#弄的,新建两个项目,一个sender,一个rec,需要说的都在代码里了 就说一下在vs里安装rabbitmq的client,如果看不懂,也懒得说了 以下是发送端的代码,就一个窗体 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using RabbitMQ.Client; using RabbitMQ.Client.Events; namespace rabbitmq_example_sender { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { // 简单队列模式 var factory =

「网易官方」极客战记(codecombat)攻略-森林-白兔-white-rabbit

这一生的挚爱 提交于 2020-08-10 09:46:16
(点击图片进入关卡) 你最好跟着那只白兔。哦,我是说发光石 简介 房间里满是陷阱。别担心,跟着闪亮的石头走。 闪亮的石头是一个物品,你可以用英雄的 findNearestItem 方法找到它。 尝试通过移动到石头的位置收集它。它很快,但它会引导你到出口。 每个项目都有属性 pos ,其中包含项目位置。对象( pos )具有属性 “x” 和“y”。 用它们来寻找你应该移动的地方。 默认代码 # 跟随闪光石的头通过陷阱。 while True: item = hero.findNearestItem() if item: # 使用 item.pos 将物品位置保存为一个新的变量: # 使用 pos.x 和 pos.y 保存坐标 # 使用 moveXY() 和 X 与 Y 变数移动至坐标 pass 概览 每个物品都是对象,它是一种数据类型,如字符串或数。 对象包含其他数据片段,称为属性。 每个项目对象(和每个单元)都有一个 pos 属性,代表它的位置。 每一个 pos 本身都是一个对象,它具有 x 和 y属性,你可以用 moveXY 和 / 或 buildXY 来使用。 此外,您可以直接引用 x 和 y 而不使用变量: item = hero.findNearestItem() if item: hero.moveXY(item.pos.x, item.pos.y) 白兔 解法 #

使用Crypto-JS进行加密解密的简单方法

徘徊边缘 提交于 2020-08-09 08:47:03
Crypto-JS是一个javascript加密解密库,使用该库进行加密解密的在线工具如: https://tool.oschina.net/encrypt 这个库的用法比较简单,相关文件可以在上面的页面查看html找到,我也备份了: https://github.com/setycyas/WebTools/tree/gh-pages/libs/Crypto-JS 文件众多,总结起来就2种,一个是核心文件core-min.js,其他的都是具体的某一种加密方法. 使用时必须加载core-min.js,然后使用哪种加密解密就加载哪个加密文件,看名字就知道是什么加密, 只有 tripledes.js比较特殊,包括DES与TripleDES两种加密解密. 加密函数的参数是:(明文字符串, 密码字符串),返回密文字符串.加密函数是: CryptoJS.AES.encrypt, CryptoJS.DES.encrypt,CryptoJS.Rabbit.encrypt,CryptoJS.RC4.encrypt,CryptoJS.TripleDES.encrypt 解密函数的参数是:(密文字符串, 密码字符串),返回的结果必须用.toString(CryptoJS.enc.Utf8)转为明文.解密函数是: CryptoJS.AES.decrypt, CryptoJS.DES.decrypt

RabbitMQ基础概念详细介绍

不羁的心 提交于 2020-08-09 00:01:53
https://www.jianshu.com/p/e55e971aebd8 本文对 rabbitmq 基础介绍,完全是为了下一篇 rabbitmq 性能测试做准备,让读者去了解我们需要测试的是什么样一个“东西”。 引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用、通讯的问题而苦恼、挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题。 消息服务擅长于解决多系统、异构系统间的数据交换(消息通知/通讯)问题,你也可以把它用于系统间服务的相互调用(RPC)。本文将要介绍的RabbitMQ就是当前最主流的消息 中间件 之一。 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的 中间件 设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性