docker 搭建rabbimq
1.拉取mq的镜像 这里选取得是rabbit:managment 可以自己选取自己喜欢
docker pull rabbitmq:managment
2.创建一个数据卷,防止数据丢失
docker volume create rabbitmq-home
3.运行rabbitmq
docker run -id --name=rabbitmq -v rabbitmq-home:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:management
可见这里除了挂载数据卷之外,还暴露了两个端口,以及设定了两个环境变量:
15672端口:RabbitMQ的管理页面端口
5672端口:RabbitMQ的消息接收端口
RABBITMQ_DEFAULT_USER环境变量:指定RabbitMQ的用户名,这里我指定为swsk33,大家部署时替换成自己定义的
RABBITMQ_DEFAULT_PASS环境变量:指定RabbitMQ的密码,这里我指定为123456,大家部署时替换成自己定义的
容器就部署完成了!在浏览器访问你的服务器地址:15672即可访问到RabbitMQ的管理界面,用户名和密码即为刚刚指定的环境变量的配置值。
这里没有指定LANG=C.UTF-8,是因为RabbitMQ容器默认就是这个语言环境,无需我们再设定。
可见RabbitMQ容器是通过指定环境变量的方式进行配置的,这比修改配置文件便捷得多,还有更多的配置用的环境变量,大家可以参考官方文档。
java操作rabbitmq
sdk 晚点补充
https://developer.aliyun.com/article/769883
1.创建spring boot项目 导入pom的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.在yaml的配置文件中加入配置信息
spring:
rabbitmq:
host: 192.168.33.10
port: 5672
username: swsk33
password: 123456
3.创建对应的需要的队列常量类
public class RabbitMQConfig {
public static final String RABBITMQ_DEMO_DIRECT_EXCHANGE = "rabbitTestDemoDirectExchange";
public static final String RABBITMQ_DEMO_TOPIC = "rabbitTestDemoTopic";
public static final String RABBITMQ_DEMO_DIRECT_ROUTING = "rabbitDemoDirectRouting";
}
4.创建一个direct交换机以及队列的配置类
@Configuration
public class DirectRabbitConfig {
@Bean
public Queue rabbitmqDemoDirectQueue() {
/**
* 1、name: 队列名称
* 2、durable: 是否持久化
* 3、exclusive: 是否独享、排外的。如果设置为true,定义为排他队列。则只有创建者可以使用此队列。也就是private私有的。
* 4、autoDelete: 是否自动删除。也就是临时队列。当最后一个消费者断开连接后,会自动删除。
* */
return new Queue(RabbitMQConfig.RABBITMQ_DEMO_TOPIC, true, false, false);
}
@Bean
public DirectExchange rabbitmqDemoDirectExchange() {
//Direct交换机
return new DirectExchange(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_EXCHANGE, true, false);
}
@Bean
public Binding bindDirect() {
//链式写法,绑定交换机和队列,并设置匹配键
return BindingBuilder
//绑定队列
.bind(rabbitmqDemoDirectQueue())
//到交换机
.to(rabbitmqDemoDirectExchange())
//并设置匹配键
.with(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING);
}
}
5.创建一个发送消息的服务类
@Service
public class RabbitMQServiceImpl implements RabbitMQService {
//日期格式化
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Resource
private RabbitTemplate rabbitTemplate;
@Override
public String sendMsg(String msg) throws Exception {
try {
String msgId = UUID.randomUUID().toString().replace("-", "").substring(0, 32);
String sendTime = sdf.format(new Date());
Map<String, Object> map = new HashMap<>();
map.put("msgId", msgId);
map.put("sendTime", sendTime);
map.put("msg", msg);
rabbitTemplate.convertAndSend(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_EXCHANGE, RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING, map);
return "ok";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
}
6.创建一个消费者
@Component
//使用queuesToDeclare属性,如果不存在则会创建队列
//如果使用queues 不会自己创建队列
@RabbitListener(queues = {RabbitMQConfig.RABBITMQ_DEMO_TOPIC})
public class RabbitMQConsumer {
@RabbitHandler
public void process(Map map) {
System.out.println("mq---消费消息如下: " + map.toString());
}
}
评论区