RabbitMQ
消息中间件:利用可靠的信息传递机制进行系统和系统直接的通讯,提供消息传递和消息的排队机制,他可以在分布式系统环境下扩展进程间的通讯。
- 基于AMQP协议
使用docker安装
- 拉取镜像并启动
docker pull rabbitmq:management
docker run -d --hostname myrabbit --name somerabbit -e RABBITMQ_DEFAULT_USER=zzzyuan -e RABBITMQ_DEFAULT_PASS=tl20010213 -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management
#-d ##后台运行容器
#--name ##指定容器名称
#-p ##暴露服务运行的端口(15672:控制台Web端口号)
#-e 指定环境变量(RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
RabbitMQ 的角色分类
- none 不能访问management plugin
- management 查看自己的相关节点信息
- 列出自己可以通过AMQP登入的虚拟机
- 查看自己的虚拟机节点 virtual hosts的queues,exchanges和bindings 信息
- 查看和关闭自己的channels和connections
- 查看有关自己的虚拟机节点virtual hosts 的统计信息。包括其他用户在这个节点virtual hosts 中的活动信息
- policymaker
- 包含management所有权限
- 查看和创建自己的virtual hosts所属的policies和parameters 信息
- monitoring
- 包含management所有权限
- 罗列出所有的virtual hosts ,包括不能登录的virtual hosts
- 查看其他用户的connection 和 channels 信息
- 查看节点级别的数据 如 clustering和memory使用情况
- 查看所有的virtual hosts 的全局统计信息
- administrator
- 最高权限
- 查看和创建,删除自己的virtual hosts
- 查看和创建,删除 users
- 查看创建permissions
- 关闭所有用户的connection
java使用rabbit
依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
第一个demo
product
package cn.zzzyuan.rabbit;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer {
public static void main(String[] args) {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("39.108.10.232");
connectionFactory.setPort(5672);
connectionFactory.setUsername("zzzyuan");
connectionFactory.setPassword("tl20010213");
connectionFactory.setVirtualHost("/");
try( Connection connection = connectionFactory.newConnection("生产者");
Channel channel = connection.createChannel()) {
// 1.队列名称 2. 是否持久化 3. 排他性,是否独立 4. 是否自动删除 5. 携带附属参数
channel.queueDeclare("queue",false,false,false,null);
channel.basicPublish("","queue",null,"msg".getBytes());
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
consume
package cn.zzzyuan.rabbit;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {
public static void main(String[] args) {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("39.108.10.232");
connectionFactory.setPort(5672);
connectionFactory.setUsername("zzzyuan");
connectionFactory.setPassword("tl20010213");
connectionFactory.setVirtualHost("/");
try (Connection connection = connectionFactory.newConnection("生产者");
Channel channel = connection.createChannel()
){
// 1.队列名称 2. 是否持久化 3. 排他性,是否独立 4. 是否自动删除 5. 携带附属参数
channel.basicConsume("queue", true, new DeliverCallback() {
@Override
public void handle(String s, Delivery delivery) throws IOException {
System.out.println(new String(delivery.getBody(), "UTF-8"));
}
}, new CancelCallback() {
@Override
public void handle(String s) throws IOException {
System.out.println("接收失败");
}
});
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
springBoot整合RabbitMQ
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
</dependency>
生产者配置
yml配置
spring:
rabbitmq:
username: user
password: pass
virtual-host: /
host: 127.0.0.1
port: 5672
server:
port: 8080
config 配置类
package cn.zzzyuan.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
/**
* FanoutExchange fanout 类型交换机
* @return
*/
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("exchangeName",true,false);
}
@Bean
public Queue queue1(){
return new Queue("queueName",true);
}
@Bean
public Queue queue2(){
return new Queue("queueName",true);
}
@Bean
public Queue queue3(){
return new Queue("queueName",true);
}
@Bean
public Binding binding1(){
return BindingBuilder.bind(queue1()).to(fanoutExchange());
}
@Bean
public Binding binding2(){
return BindingBuilder.bind(queue2()).to(fanoutExchange());
}
@Bean
public Binding binding3(){
return BindingBuilder.bind(queue3()).to(fanoutExchange());
}
}
消息派发
package cn.zzzyuan.service;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RabbitMqService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void rabbitTest(){
rabbitTemplate.convertAndSend("exchangeName","queueName1","msg");
}
}
消费者
yml
spring:
rabbitmq:
username: user
password: pass
virtual-host: /
host: 127.0.0.1
port: 5672
server:
port: 8081
接收Service
![cow](C:\Users\86188\Downloads\cow.pngpackage cn.zzzyuan.service;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
@Service
@RabbitListener(queues = {"queueName1"})
public class RabbitMqConsume {
@RabbitHandler
public void receiverMsg(String msg){
System.out.println("收到消息" + msg);
}
}