RabbitMQ 重要元件有
ConnectionFactory
Channel: 發送訊息
Exchange: 交換器,分發訊息
Queue: 儲存 producer 發送的訊息
RoutingKey: exchange 把 producer 的訊息寫入不同的 queue
BindingKey: exchange 綁定到不同的 queue
exchange 支援的訊息模式:
direct
預設 路由模式。發送訊息到指定的 Routing Key,寫入不同的 queue
fanout
廣播模式。將訊息送到綁定的所有 queues 裡面。性能最好,最常用
headers
匹配模式。根據訊息的 header 跟 queue 的參數匹配。性能差,少用
topic
匹配模式。可使用
*
匹配
rabbitmq cli 設定新增 user
rabbitmqctl add_user admin password
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator
rabbitmqctl delete_user guest
rabbitmqctl list_users
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
org.springframework.boot.autoconfigure.AutoConfiguration.imports 註冊
RabbitAutoConfiguration。參數綁定類別為 RabbitProperties。參數為 spring.rabbitmq.*
application.yml
spring:
rabbitmq:
host: localhost
port: 5672
username: admin
password: password
也可以設定為 uri 形式
spring:
rabbitmq:
addresses: "amqp://admin:password@localhost"
MsgController.java
package com.test.amqp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RestController
@Slf4j
public class MsgController {
private final RabbitTemplate rabbitTemplate;
/**
* send message: Direct mode
* @param msg
* @return
*/
@RequestMapping("/send")
public String sendMsg(@RequestParam("msg") String msg) {
rabbitTemplate.convertAndSend("test-direct-exchange",
"test-direct-routing-key", msg);
return "message sent";
}
/**
* receive message: Direct Mode
* @param msg
*/
@RabbitListener(queues = "test-direct-queue")
public void receiveMsg(String msg) {
log.info("message received:{}", msg);
}
}
RabbitMQ 無法自動產生 queue, exchange。除了能在 web console 設定,也可以透過程式設定
package com.test.amqp;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
/**
* create queue: Direct Mode
* @return
*/
@Bean
public Queue testDirectQueue() {
return new Queue("test-direct-queue");
}
/**
* create exchange: Direct Mode
* @return
*/
@Bean
public DirectExchange TestDirectExchange() {
return new DirectExchange("test-direct-exchange");
}
/**
* create routing key: Direct Mode
* @param testDirectQueue
* @return
*/
@Bean
public Binding testDirectBinding(Queue testDirectQueue) {
return BindingBuilder.bind(testDirectQueue)
.to(TestDirectExchange()).with("test-direct-routing-key");
}
}
測試
沒有留言:
張貼留言