rabbitmq的流程是发送端-交换机-队列-接收端,交换机的作用是决定消息发送到哪个队列。交换机制有好几种,其中topic较灵活,默认的为路由完全匹配才发送到相应队列。
记录一下rabbitmq的使用。
首先要安装rabbitmq,在此之前,先安装erlang,这个最好选版本在9.3~10.3之间的,我下了一个最新版的有问题。然后添加bin目录到环境变量。
rabbitm安装后,在sbin目录下使用cmd命令运行
rabbitmq-plugins enable rabbitmq_management
这个作用是启动插件管理。然后使用
net stop RabbitMQ && net start RabbitMQ
重启下服务,这个应该要用管理员去运行cmd。
使用
rabbitmqctl add_user admin 123456
添加新用户,后2个是用户名和密码。使用
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
设置用户的权限。否则没有权限建立queue之类的。
要修改密码用
rabbitmqctl change_password userName newPassword
访问http://localhost:15672可以看到管理界面了,默认端口号是5672,浏览器却用15672,搞不清楚。
写代码前或写好代码运行前,要先在管理界面新建queue,代码用了哪些就要新建哪些,使用代码自动新建目前不会。
-------------------------------------------------------------------------------------------------------------------------
依赖为
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置文件,具体看自己的设置
spring.application.name=spirng-boot-rabbitmq
spring.rabbitmq.host=192.168.0.86
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
配置一个queue,交换机和相应绑定规则,这里使用的是topic,规则为topic.单词,topic.*或topic.#
*表示一个单词,#可以表示多个单词
@Configuration
public class RabbitConfig {
@Bean
public Queue Queue() {
return new Queue("hello");
}
TopicExchange exchange() {
return new TopicExchange("exchange");
}
@Bean
Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
}
发送端
@Component
public class HelloSender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send() {
String context = "hello " + new Date();
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("hello","topic.message",context);//发送到hello队列
}
}
接收端
@Component
@RabbitListener(queues = "hello")//队列名字为之前命名的hello
public class HelloReceiver {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
}
测试,只要发送了,接收端自动能接收了。
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMqHelloTest {
@Autowired
private HelloSender helloSender;
@Test
public void hello() throws Exception {
helloSender.send();
}
}
以上是一个简单的一对一发送,还有一对多,多对多的发送。
其中一对多并不是所有消息发送给所有接受者,而是消息均匀分布给接受者。多对多类似。
学习链接:点击打开链接