RabbitMQ添加监控

RabbitMQ添加监控

主要参考这篇官方文档:
https://www.rabbitmq.com/monitoring.html

有如下接口:

  • /api/overview
    • GET请求,集群概况
  • /api/nodes/{node}
    • GET请求,获取单个节点情况
  • /api/nodes
    • GET请求,获取所有节点情况
  • /api/queues/{vhost}/{qname}
    • GET请求,获取队列情况
  • /api/nodes/{node}/memory
    • GET请求,内存相关

其他:

1
2
3
rabbitmq-diagnostics 

加各种参数,具体参见官方文档吧,犯懒就不翻译了

RabbitMQ常用命令汇总

RabbitMQ常用命令汇总

RabbitMQ常用命令汇总

安装过程略。

消息队列常用命令

启动

注意按照顺序,必须先启动节点

\ rabbitmq-server -detached #后台启动节点\ rabbitmqctl start_app #启动RabbitMQ应用服务, Starts the RabbitMQ application.\

关闭RabbitMQ应用服务

Stops the RabbitMQ application, leaving the runtme (Erlang VM) running.
\ rabbitmqctl stop_app #关闭RabbitMQ应用服务\

关闭节点

Shuts down the node, both RabbitMQ and its runtime.
\ rabbitmqctl shutdown\

关闭Erlang节点

Stops the Erlang node on which RabbitMQ is running.
\ rabbitmqctl stop\

启动web管理插件

\ rabbitmq-plugins enable rabbitmq_management #启动web管理插件\

重置节点

Returns a RabbitMQ node to its virgin state.
\ rabbitmqctl reset\

集群常用命令

将一个节点(ram方式,默认是disc)加入集群

\ rabbitmqctl join_cluster hare@elena --ram\

查看集群状态

\ rabbitmqctl cluster_status\

修改节点类型

节点类型只能是disc或是ram
\ rabbitmqctl stop_app\ rabbitmqctl change_cluster_node_type ram\ rabbitmqtl start_app\

在当前集群中加入某节点

\ rabbitmqctl join_cluster {rabbit_node_name} (某些低版本可以采用rabbitmqctl cluster {rabbit_node_name})\

将某节点剔除出当前集群

\ rabbitmqctl forget_cluster_node {rabbit_node_name}\

获取服务器状态信息

\ rabbitmqctl status\

队列信息

\ rabbitmqctl list_queues [-p vhostpath] [queueinfoitem …]\
queueinfoitem可以为: name, durable, autodelete, arguments, messagesready, messages_unacknowled, messages, consumers, memory.

Exchange信息

\ rabbitmqctl list_exchanges [-p vhostpath] [exchangeinfoitem …]\
exchangeinfoitem有:name, type, durable, auto_delete, internal, arguments.

Binding信息

\ rabbitmqctl list_bindings [-p vhostpath] [bindinginfoitem …]\
bindinginfoitem有:sourcename, sourcekind, destinationname, destinationkind, routing_key, arguments.等

connection信息

\ rabbitmqctl list_connections [connectioninfoitem …]\
connectioninfoitem有:recvoct,recvcnt,sendoct,sendcnt,send_pend等。

channel信息

\ rabbitmqctl list_channels [channelinfoitem …]\
channelinfoitem有:consumercount,messagesunacknowledged,messagesuncommitted,acksuncommitted,messagesunconfirmed,prefetchcount,clientflowblocked

vhost管理

\ 添加vhost: rabbitmqctl add vhost {name}\ 删除vhost: rabbitmqctl delete vhost {name}\

镜像队列的设置

镜像队列的配置通过添加policy完成,policy添加的命令为:
\ rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]\
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition: 镜像定义,包括三个部分 ha-mode,ha-params,ha-sync-mode
    ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
        all表示在集群所有的节点上进行镜像
        exactly表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
        nodes表示在指定的节点上进行镜像,节点名称通过ha-params指定
    ha-params: ha-mode模式需要用到的参数
    ha-sync-mode: 镜像队列中消息的同步方式,有效值为automatic,manually
Priority: 可选参数, policy的优先级

例如,对队列名称以hello开头的所有队列进行镜像,并在集群的两个节点上完成镜像,policy的设置命令为:
\ rabbitmqctl set_policy hello-ha “^hello” ‘{“ha-mode”:“exactly”,“ha-params”:2,“ha-sync-mode”:“automatic”}\

插件管理

开启某个插件

\ rabbitmq-plugins enable {插件名}\

关闭某个插件

\ rabbitmq-plugins disable {插件名}\

用户管理

添加用户

\ rabbitmqctl add_user {username} {password}\

删除用户

\ rabbitmqctl delete_user {username}\

修改密码

\ rabbitmqctl change_password {username} {newpassword}\

设置用户角色

\ rabbitmqctl set_user_tags {username} {tag} tag可以为administrator, monitoring, management\

权限管理

权限设置

\ rabbitmqctl set_permissions [-p vhostpath] {user} {conf} {write} {read}\
conf:一个正则表达式match哪些配置资源能够被该用户访问。
write:一个正则表达式match哪些配置资源能够被该用户读。
read:一个正则表达式match哪些配置资源能够被该用户访问。

查看(指定vhost)所有用户的权限信息

\ rabbitmqctl list_permissions [-p vhostPath]\

查看指定用户的权限信息

\ rabbitmqctl list_user_permissions {username}\

清除用户的权限信息

\ rabbitmqctl clear_permissions [-p vhostPath] {username}\
示例:
\ rabbitmqctl set_permissions -p / root “.*” “.*” “.*”\

参考资料

RabbitMq常用命令
rabbitmqctl(8)
rabbitmq——镜像队列

将代码从svn迁移到git

将代码从svn迁移到git

需求

工作里打算将代码从svn迁移到git,但svn毕竟用了一段时间,提交记录、tag、release等信息希望还能继续保留。

方案

git官方本身就给了一个教程,参见:
Git与其他系统-迁移到Git

教程本身就交代了前因后果,我就不再赘述,基本按照流程走就可以,我这里只是说下我的步骤以及遇到的坑。

准备users.txt文件

我直接手写的,毕竟提交人不算多,也可以执行官方提供的命令:
svn log ^/ --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt

准备好users.txt之后,执行git svn clone命令

输入git svn clone命令后,在windows上后依次弹出3个输入框,依次输入:
– windows用户验证框:输入windows登录密码
– svn用户名
– svn密码

输入后等待即可。

我执行的命令如下:
git svn clone svn://xxx.xxx.xxx.xxx/yyy/ –no-metadata –authors-file=users.txt –no-minimize-url -s xxx
git网页上给的命令,有提到--no-metadata是去掉svn的元数据,但如果不加入--no-minimize-url命令,git svn clone这条命令可能会去扫描更上层的svn目录。会有类似这样的提示信息:
Initialized empty Git repository in /Users/doc/Test/Demo/.git/ Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/android W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/xxxxxxbranch/android' path not found W: Do not be alarmed at the above message git-svn is just searching aggressively for old history. This may take a while on large repositories ^Cecked through r290000

我记得如果你没权限的话会报错。保险起见,还是在命令行加入–no-minimize-url参数吧,主要是不缩小输入的地址。

报错:Author: xx not defined in users.txt file

如果你输入的authors.txt中用户映射没列全、svn的用户有遗漏,可能有如下报错:
Author: xx not defined in users.txt file
此时记得修改authors.txt文件,删除整个文件夹,重新执行git svn clone命令。

注意

  • 请在一个空白的、没有与git或是svn关联的文件夹(最好就是新建一个文件夹)中执行git svn clone这条命令,否则操作结果可能比较怪,我一开始没留意,在一个git库中执行这命令,结果有点奇怪,就不多提了。
  • 这条命令的执行时间依赖于你的svn版本库内容的多寡,比如我迁移的svn大概用了半年多吧,提交记录、tag比较多,结果执行git svn clone这条命令大概执行了3个多小时……执行该命令时确保网络状况良好,然后你就可以去做别的事情了

git svn clone执行结束、没报任何错误的话,你会在你指定的文件夹内看到你想迁移的svn代码。接下来,按照git给的说明,继续执行后续命令,基本就没啥坑了,汇总命令列表见下面汇总

汇总

  1. 准备users.txt文件
  2. 准备好users.txt之后,执行git svn clone命令
  3. git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag “$tagname” “tags/$tagname”; git branch -r -d “tags/$tagname”; done
  4. git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch “$branchname” “refs/remotes/$branchname”; git branch -r -d “$branchname”; done
  5. git remote add origin xxxx 这里需要写上你自己的git远端地址,比如gitlab上你创建的项目地址
  6. git push origin –all
  7. git push origin –tags

基本流程就这样,还是比较简单的

参考帖子

JAVA生成总和及个数确定的一组随机数【转载】

JAVA生成总和及个数确定的一组随机数【转载】

JAVA生成总和及个数确定的一组随机数

转载在博客文章 JAVA生成总和及个数确定的一组随机数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

public class Test {

public static void main(String[] args) {

splitRedPacket(40000, 41, 300, 1500);
System.out.println("*****************");
splitRedPacket(20000, 30, 300, 1000);

}

/**
*
* @param total
* 总金额
* @param splitCount
* 个数
* @param min
* 最小金额
* @param max
* 最大金额
*/
public static void splitRedPacket(int total, int splitCount, int min, int max) {
System.out.println("总金额: " + total);
System.out.println("个数: " + splitCount);
System.out.println("最小金额: " + min);
System.out.println("最大金额: " + max);

ArrayList<Integer> al = new ArrayList<Integer>();
Random random = new Random();

if ((splitCount & 1) == 1) {// 奇数个红包,需要单独将其中一个红包先生成,以保证后续算法拆分份数为偶数。
System.out.println("红包个数" + splitCount + "是奇数,单独生成一个红包");
int num = 0;
do {
num = random.nextInt(max);
// num = (total - num) % (splitCount / 2) + num; //
// 将后面算法拆分时的余数加入到这个随机值中。
System.out.println("单个的随机红包为:" + num);
} while (num >= max || num <= min);

total = 40000 - num;
al.add(num);
}
int couples = splitCount >> 1;
int perCoupleSum = total / couples;

if ((splitCount & 1) == 1) {
System.out.println("处理后剩余的金额为:" + total);
}
System.out.println("将" + total + "元拆分为" + couples + "对金额,每对总额:" + perCoupleSum);

for (int i = 0; i < couples; i++) {
Boolean finish = true;
int num1 = 0;
int num2 = 0;
do {
num1 = random.nextInt(max);
num2 = perCoupleSum - num1;
if (!al.contains(num1) && !al.contains(num2)) {
if (i == 0) {
num1 = (total - couples * perCoupleSum) + num1;
}
}
} while (num1 < min || num1 > max || num2 < min || num2 > max);
al.add(num1);
al.add(num2);
}

int check_num = 0;
Integer.compare(1, 2);
al.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
});

System.out.println(Arrays.toString(al.toArray()));

for (int x : al) {
check_num = check_num + x;
}
System.out.println("验证总和:" + check_num);
}
}

【NPM】npm ERR! Unexpected end of JSON input while parsing near ‘…”,’解决方案【转载】

【NPM】npm ERR! Unexpected end of JSON input while parsing near ‘…”,’解决方案【转载】

问题描述

今天安装项目依赖npm install 的时候出现错误:

1
npm ERR! Unexpected end of JSON input while parsing near '...e":"^23.5.0","listr":'

方案一:

第一步:

1
npm cache clean --force

第二步:(再安装)

1
2
3
4
5
npm install --registry=https://registry.npm.taobao.org

方案二
执行以上操作依然没解决问题。最后切换为官方镜像后解决了,具体原因不详。
第一步:
1
npm cache clean --force

第二步:(再安装)

1
npm set registry https://registry.npmjs.org/

作者:GeniusLyzh
出处:http://www.cnblogs.com/GeniusLyzh/
本文链接:https://www.cnblogs.com/GeniusLyzh/p/9773440.html\
本文版权归作者和博客园共有,欢迎转载,须保留此段声明,并给出原文链接,谢谢!
如果阅读了本文章,觉得有帮助,欢迎点击右下角推荐

NodeJs:安装插件‘xxx’后,提示‘xxx’ 不是内部或外部命令也不是可运行的程序或批处理文件【转载】

NodeJs:安装插件‘xxx’后,提示‘xxx’ 不是内部或外部命令也不是可运行的程序或批处理文件【转载】

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin\_42941619/article/details/94627644\
1:首先使用npm、cnpm或者yarn下载所需插件,以nodemon这个插件举例

npm install -g nodemon

2: 命令行查询插件版本信息

nodemon –version

3:如果提示‘nodemon’ 不是内部或外部命令解决方法

找到nodejs下的nodemon插件,复制此路径!下面要用到。

4:右击–我的电脑–单击属性–高级系统设置–环境变量

选中用户变量的path,然后编辑,然后将第三步复制的路径添加到path配置中,保存,保存,保存!

5:重新打开命令行工具

nodemon –version

这样就解决了’xxx’插件不是内部或外部命令也不是可运行的程序或批处理文件的问题。

巴拉巴拉:

==主页传送门==
————————————————
版权声明:本文为CSDN博主「雨雪风晴是你」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin\_42941619/article/details/94627644

java中List数据合并与去重

java中List数据合并与去重

单个List数据去重

思路:利用HashSet
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("c");
list.add("c");
for (String string : list) {
System.out.println(string);
}
System.out.println("=============================");
//转成set
List<String> listWithoutDup = new ArrayList<>(new HashSet<>(list));
for (String str : listWithoutDup) {
System.out.println(str);
}

多个List合并,数据去重

java 8 之前

思路:

  1. list1.removeAll(list2)
  2. list1.addAll(list2)
    代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) {
List<String> list = new ArrayList<>();
List<String> list2 = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("c");
list2.add("a");
list2.add("e");
list2.add("e");
list2.add("g");
list2.add("g");
for (String string : list) {
System.out.println(string);
}
//此处指的是将与list2重复的删除
list.removeAll(list2);
//此处指加上list2
list.addAll(list2);
System.out.println("=============================");
for (String string : list) {
System.out.println(string);
}
}

java 8以及更高版本:lambda表达式

1
2
List<String> result = Stream.of(Lists.newArrayList("1", "1", "3"), Lists.newArrayList("1", "2"))
.flatMap(Collection::stream).distinct().collect(Collectors.toList());

代码很优雅,但是要合并的list内元素是对象需要equals和hashcode方法

参考资料: