linux安装rabbitmq
安装rabbitmq需要安装erlang,在对应官网分别下载对应源码文件
rabbitmq 下载页面http://www.rabbitmq.com/download.html 下载RHEL/CentOS 6.x
erlang 下载页面http://www.erlang.org/downloads 下载OTP 21.0 Source File
安装erlang与对应依赖
yum install ncurses-devel
解压erlang的gz文件 tar xf otp_src_*
进入解压后目录 cd otp_src_*
执行./configure –prefix=/usr/local/erlang20 –without-javac
编译 make -j 4 根据核数而定这个数字 若不确定可写1
安装 make install
检查erlang是否安装成功 进入对应目录 cd /usr/local/erlang20 -> cd bin -> ./erl 判断是否进入Eshell 若进入则安装成功
安装rabbitmq
安装依赖 yum install python -y -> yum install xmlto -y -> yum install python-simplejson -y
rpm -ivh rabbitmq-server-*.rpm
顺便提下 linux安装包的卸载命令
1 2 3 4 5 6 7
| rpm -qa | grep 包名
这个命令是为了把包名相关的包都列出来
rpm -e 文件名
这个命令就是你想卸载的软件,后面是包名称,最后的版本号是不用打的
|
安装包的卸载命令详细可查看
配置账号信息
- rabbitmqctl list_users 查看当前账号列表
- rabbitmqctl add_user admin admin 添加账号 前面是户名后面是密码
- rabbitmqctl set_user_tags admin administrator 设置账号权限
- rabbitmqctl set_permissions -p “/“ admin “.*“ “.“ “.“ 设置账号可以远程访问
rabbitmq启动
- service rabbitmq-server start 启动
2. service rabbitmq-server stop 停止
3. service rabbitmq-server restart 重启
启动rabbitmq内置web插件
rabbitmq-plugins enable rabbitmq_management
访问 http://你的地址:15672/#/users
springboot使用rabbitmq
依赖引入
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
|
配置文件
1 2 3 4 5 6
| spring: rabbitmq: host: 118.89.34.60 ip地址 port: 5672 端口号 username: wugui 用户名 password: 15213497317 密码
|
请它属性可查看文档
发送消息
1 2 3 4 5 6 7 8
| @Component public class HelloSend { @Autowired private AmqpTemplate rabbitTemplate; public void send(String msg){ rabbitTemplate.convertAndSend("hello",msg); // 注意 hello msg可以是一个任意Object } }
|
接收消息
1 2 3 4 5 6 7 8
| @Component @RabbitListener(queues = "hello") //注意 hello public class HelloReceiver { @RabbitHandler public void receiver(String msg){ System.out.println("我接收的" + msg); } }
|
可以将@RabbitListener注解在方法上或者类上 如果注解在方法上则方法体上则不需要@RabbitHandler注解并且一个类可以监听多个队列
注意hello该字符为消息队列名,发送则与接收则需要统一并且消息队列名需要添加在rabbitmq中 可在http://你的地址:15672/#/users 中添加
配置队列
如果不在rabbitmq中添加则可以写如下配置类 将会在rabbitmq中添加消息队列
1 2 3 4 5 6 7
| @Configuration public class RabbitConfig { @Bean public Queue qryQueue(){ return new Queue("hello"); } }
|
一个消息队列的发送则与接收则可以有多个,消息堆积时接收则均分消息
订阅模式
配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| final static String one = "topic.rr"; final static String two = "topic.qw"; @Bean public Queue queueOne() { // 配置队列一 return new Queue(RabbitConfig.one); } @Bean public Queue queueTwo() { //配置队列二 return new Queue(RabbitConfig.two); } @Bean TopicExchange exchange() { // 配置交换机 return new TopicExchange("exchange"); } // 将队列一绑定与交换机并且指定接收消息队列 @Bean Binding bindingExchangeMessage(Queue queueOne, TopicExchange exchange) { return BindingBuilder.bind(queueOne).to(exchange).with("topic.rr"); } // 将队列二绑定与交换机并且指定接收交换机下面所有的topic.#系列的消息 @Bean Binding bindingExchangeMessages(Queue queueTwo, TopicExchange exchange) { return BindingBuilder.bind(queueTwo).to(exchange).with("topic.#"); }
|
发送消息
1 2 3 4 5 6
| public void sendo(String msg){ rabbitTemplate.convertAndSend("exchange","topic.rr",msg); } public void sendt(String msg){ rabbitTemplate.convertAndSend("exchange","topic.qw",msg); }
|
接收消息
1 2 3 4 5 6 7 8
| @RabbitListener(queues = "topic.rr") public void receivero(String msg){ System.out.println("2" + msg); } @RabbitListener(queues = "topic.qw") public void receivert(String msg){ System.out.println("3" + msg); }
|
当发送sendo()时 消息监听topic.rr与topic.qw都将会接收到消息 发送的为topic.rr将匹配到队列一与队列二
当发送sendt()时 消息监听topic.qw将会接收到消息 因为交换机将topic.qw绑定与topic.#上,这里的#将匹配零个或多个词 若为*表示一个词
广播模式
配置类
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
| @Configuration public class FanoutRabbitComfig { private final static String faouta = "a"; private final static String faoutb = "b"; private final static String faoutc = "c"; @Bean public Queue qrya(){ return new Queue("a"); } @Bean public Queue qryb(){ return new Queue("b"); } @Bean public Queue qryc(){ return new Queue("c"); } @Bean public FanoutExchange cre(){ return new FanoutExchange("broadcast"); } @Bean public Binding bindExchangeA(Queue qrya,FanoutExchange fanoutExchange){ return BindingBuilder.bind(qrya).to(fanoutExchange); } @Bean public Binding bindExchangeB(Queue qryb,FanoutExchange fanoutExchange){ return BindingBuilder.bind(qryb).to(fanoutExchange); } @Bean public Binding bindExchangeC(Queue qryc,FanoutExchange fanoutExchange){ return BindingBuilder.bind(qryc).to(fanoutExchange); } }
|
发送广播消息
1 2 3
| public void sendBroadcast(String msg){ rabbitTemplate.convertAndSend("broadcast","",msg); }
|
发送如上广播消息后 则交换机broadcast内所有的监听器都能接收到对应消息