rabbit的简单搭建,java使用rabbitmq queue的简单例子和一些坑
一 整合
由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。
附上自己的项目地址https://github.com/247292980/spring-boot
以整合功能
spring-boot,FusionChart,thymeleaf,vue,ShardingJdbc,mybatis-generator,微信分享授权,drools,spring-security,spring-jpa,webjars,Aspect,drools-drt
这次就来整合下简单的rabbitmq
二 安装
这玩意最坑的地方在于,百度第一的安装教程,缺了一部分。
1.安装erlong,搭建环境变量
2.安装mq
3.这里他有一个mq管理插件的东西,我只想说这玩意很老了,新的mq基本都自己装了, http://localhost:15672 你能打开就是已经装成功,所以xxx plugin unchange的其实是没有错的。
或许有人用老板的我也贴一下相应代码,以下所有命令默认cd到mq的sbin目录下
enable rabbitmq_management
4.查询用户
rabbitmqctl.bat list_users
5.新增一个用户
rabbitmqctl.bat add_user username password
例子
rabbitmqctl.bat add_user haha
6.更改角色
rabbitmqctl.bat set_user_tags username role 例子
rabbitmqctl.bat set_user_tags haha administrator
7.改密码
rabbitmqctl change_password userName newPassword 例子
rabbitmqctl change_password haha 123456
8.删除用户
rabbitmqctl.bat delete_user username 例子
rabbitmqctl.bat delete_user haha
9.设置用户权限
rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP 例子 这个例子一定要跑一下,百度第一的照着做会报你没有权限的error,授予用户username在服务器根目录辖所有资源的读写权限
rabbitmqctl.bat set_permissions -p "/" haha ".*" ".*" ".*"
10.查看(指定hostpath)所有用户的权限信息
rabbitmqctl list_permissions [-p VHostPath]
11.查看指定用户的权限信息
rabbitmqctl list_user_permissions User 例子
rabbitmqctl list_user_permissions haha
12.清除用户的权限信息
rabbitmqctl clear_permissions [-p VHostPath] User 例子
rabbitmqctl clear_permissions [-p VHostPath] haha
13.在写demo之前,我们还要做一个事情,添加一个队列,进入http://localhost:15672点击queues标签即能看到
三 代码
生产者
/**
* @AUTHOR lgp
* @DATE 2018/9/7 17:27
* @DESCRIPTION rabbitmq的消息生产者
**/
public class Producer {
public final static String QUEUE_NAME = "rabbitMQ.lgp";
public static final Logger log = LoggerFactory.getLogger(Producer.class); public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置RabbitMQ相关信息
factory.setHost("localhost");
factory.setUsername("haha");
factory.setPassword("123456789");
factory.setPort(5672);
//创建一个新的连接
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
//创建一个通道
// 声明一个队列
// public com.rabbitmq.client.AMQP.Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) throws IOException
boolean durable = true;
boolean exclusive = false;
boolean auto_delete = false;
// Map<String, Object> arguments = new HashMap<String, Object>();
// // 统一设置队列中的所有消息的过期时间
// arguments.put("x-message-ttl", 30000);
// // 设置超过多少毫秒没有消费者来访问队列,就删除队列的时间
// arguments.put("x-expires", 20000);
// // 设置队列的最新的N条消息,如果超过N条,前面的消息将从队列中移除掉
// arguments.put("x-max-length", 4);
// // 设置队列的内容的最大空间,超过该阈值就删除之前的消息
// arguments.put("x-max-length-bytes", 1024);
// // 将删除的消息推送到指定的交换机,一般x-dead-letter-exchange和x-dead-letter-routing-key需要同时设置
// arguments.put("x-dead-letter-exchange", "exchange.dead");
// // 将删除的消息推送到指定的交换机对应的路由键
// arguments.put("x-dead-letter-routing-key", "routingkey.dead");
// // 设置消息的优先级,优先级大的优先被消费
// arguments.put("x-max-priority", 10);
channel.queueDeclare(QUEUE_NAME, durable, exclusive, auto_delete, null);
String message = "Hello RabbitMQ";
//发送消息到队列中
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
log.info("Producer Send message={}", message);
//关闭通道和连接
channel.close();
} }
}
消费者
/**
* @AUTHOR lgp
* @DATE 2018/9/7 17:34
* @DESCRIPTION 消费者
**/
public class Customer {
private final static String QUEUE_NAME = "rabbitMQ.lgp";
public static final Logger log = LoggerFactory.getLogger(Customer.class); public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置RabbitMQ地址
factory.setHost("localhost");
factory.setUsername("haha");
factory.setPassword("123456789");
factory.setPort(5672);
try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
//创建一个通道
//声明要关注的队列
//队列持久化,在RabbitMQ重启保证队列不会丢失
boolean durable = true;
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
System.out.println("Customer Waiting Received messages");
//DefaultConsumer类实现了Consumer接口,通过传入一个频道,
// 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
log.info("Customer Received message={}", message);
}
};
//自动回复队列应答 -- RabbitMQ中的消息确认机制
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
}
四 注意点
1.我为了测试queueDeclare的参数代表的是什么意思,起了什么作用(由于多次测试,也出现了下面这些奇奇怪怪的bug),发现exclusive 和auto_delete的报错都是说auto_delete,但是具体的作用就是不同,所以你懂得...
2.还有一个谜一样的bug,我能上http://localhost:15672,但是java代码死活不行,那我看看cmd正不正常,然后
Error: unable to perform an operation on node 'rabbit@haha'. Please see diagnostics information and suggestions below. Most common reasons for this are: * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running In addition to the diagnostics info below: * See the CLI, clustering and networking guides on http://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@haha DIAGNOSTICS
=========== attempted to contact: [rabbit@haha] rabbit@haha:
* connected to epmd (port 4369) on haha
* epmd reports node 'rabbit' uses port 25672 for inter-node and CLI tool traffic
* TCP connection succeeded but Erlang distribution failed * Hostname mismatch: node "rabbit@xxxx" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@xxxx" Current node details:
* node name: rabbitmqcli30@haha
* effective user's home directory: C:\Users\xxxx
* Erlang cookie hash: 0rVZh7WgaAP8H8hmZPiGLA==
就是说,node没创建?我都用haha登上你的web管理系统啊???
这报错莫名其妙的出现了我电脑的名字,,,,
看情况就是node rabbit@xxxx这玩意是mq底层取参数,取到了电脑的名字去了?然后两个mabbit都启动erlang,erlang抢夺端口的error??
解决方法 删除所有mq线程,重启mq
3.同样是一个谜一样的bug,启动rabbit成功,但是java还是不同跑
Error: unable to perform an operation on node 'rabbit@haha'. Please see diagnostics information and suggestions below. Most common reasons for this are: * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running In addition to the diagnostics info below: * See the CLI, clustering and networking guides on http://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@haha DIAGNOSTICS
=========== attempted to contact: [rabbit@haha] rabbit@haha:
* connected to epmd (port 4369) on haha
* epmd reports: node 'rabbit' not running at all
no other nodes on haha
* suggestion: start the node Current node details:
* node name: rabbitmqcli26@haha
* effective user's home directory: C:\Users\xxxx
* Erlang cookie hash: 0rVZh7WgaAP8H8hmZPiGLA==
node没有创建,那么不是重启rabbitmq这个层次的问题啊...
解决方法
在windows的服务里面重启rabbitmq的服务,出现这问题的原因可能是我开了两个cmd操作rabbitmq,搞到erlang线程死锁了,,,,
4.代码里我只写了mq的简单应用,比较核心的如分发,订阅等我都没有写,因为用过mq的都知道,这些东西其实都是一样的简单的(像我测试queueDeclare那样一个一个改一个一个看具体作用,好蠢是不是...),主要是设计思路.所以我就不写其他的例子,只写了消息队列中的简单队列。
5.这个是上面两个的低配版。error node with name "rabbit" already running on “xxxxxxx”
一看就知道重启mq就行了
rabbit的简单搭建,java使用rabbitmq queue的简单例子和一些坑的更多相关文章
- docker的简单搭建(java/tomcat 环境)
1.一副图简单了解下docker的布局,它是虚拟的,docker分为私服.镜像.容器三个模块 一般从私服pull镜像,镜像run一个容器,我们把容器作为一个虚拟服务,里面可以独立运行进程有独立的内网I ...
- java基础学习02(简单的java程序)
简单的java程序 一.完成的目标 1. 理解java程序的基本组成 2. 如何对程序代码进行注释 3. java标识符的命名规则 4. 了解java中的关键字 5. 使用java定义变量或声明变量 ...
- RabbitMQ学习第一记:用java连接RabbitMQ
1.什么是RabbitMQ MQ(Message Queue):消息队列,是服务端设计的一个可以存储大量消息的队列,并提供客户端操作队列的方法:生产队列(向队列中添加数据).消费队列(从队列中取数据) ...
- RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成
搭建好maven项目环境,加入RabbitMQ依赖包 <dependency> <groupId>org.springframework.amqp</groupId> ...
- springmvc4环境简单搭建和定时任务
之前复制粘贴创建了几个ssm的项目,然而回头让自己写的时候还是一头雾水,究其原因是spring的陌生.仅仅是写过几个helloworld而已.而且是照着写.我都不知道springmvc到底需要多少ja ...
- 1.0、Struts2的简单搭建方法
一.Struts2:是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet:用于jsp页面与Java代码之间的交互. 1.核心:Filter拦截器,对所有的请求进行拦截. 2.工作 ...
- 零配置简单搭建SpringMVC 项目
SpringMVC是比较常用的JavaWeb框架,非常轻便强悍,能简化Web开发,大大提高开发效率,在各种Web程序中广泛应用.本文采用Java Config的方式搭建SpringMVC项目,并对Sp ...
- windows 下用eclipse搭建java、python开发环境
本人只针对小白!本文只针对小白!本文只针对小白! 最近闲来无事,加上之前虽没有做过eclipse上java.python的开发工作,但一直想尝试一下.于是边查找资料边试验,花了一天时间在自己的机器上用 ...
- 阿里云上安装mysql步骤/ 阿里云ECS搭建Java+mysql+tomcat环境
使用阿里云ECS挺长一段时间了.这两天碰巧朋友小白让我一步一步教他在ECS上搭建Java+mysql+tomcat环境,所以把在这里把步骤在这简单整理了一下,以便需要的人查阅. 我购买的阿里云服务器系 ...
随机推荐
- ruby中特殊的全局变量
全局变量:由$开头,可以在程序的任何位置访问到.在初始化前,全局变量有一个特殊的值 nil. 这里列出了一些以$打头并跟单个字符的特殊变量,包括主要的系统变量以及它们的含义: $! 最近一次的错误信息 ...
- Oracle中生成UUID
Oracle中生成跨系统的唯一识别符UUID非常方便,比生成序列还简单,直接用sys_guid()就行, 例如select sys_guid() from dual 会产生一个跟MAC地址.生成时间相 ...
- [cf687c]The Values You Can Make(01背包变形)
题意:给定n个硬币,每个硬币都有面值,求每个能构成和为k的硬币组合中,任意个数相互求和的总额种类,然后将所有硬币组合中最后得到的结果输出. 解题关键:在01背包的过程中进行dp.dp[i][j]表示组 ...
- [poj2104]可持久化线段树入门题(主席树)
解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序 ...
- HDFS追加文件
配置:hdfs-site.xml <property> <name>dfs.support.append</name> <value>true</ ...
- 6.7 使用IDEA导入工程
打开IDEA->File->new -> Project from existing ..->选择你的工程,导入: 请注意,在130或者40上面的项目并不是最新的,sunny也 ...
- Netty 线程模型与Reactor 模式
前言 Netty 的线程模型是基于NIO的Selector 构建的,使用了异步驱动的Reactor 模式来构建的线程模型,可以很好的支持成百上千的 SocketChannel 连接.由于 READ/W ...
- 利用css实现鼠标经过元素,下划线由中间向两边展开
代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- jquery筛选元素函数
jquery筛选元素函数 1.过滤匹配第二个p元素: $("button").click(function(){ $("p").eq(1).css(" ...
- Vim7.4 配置项列表
vim所有的配置项如下,可以根据自己的需要进行配置,每个配置项的详细信息 可以在vim里面使用:help option-name # 配置项名称 缩写词 简要说明 'aleph' 'al' Aleph ...