rabbitMq-Spring AMQP
Spring-amqp是對AMQP協議的抽象實現,而spring-rabbit 是對協議的具體實現,也是目前的唯一實現。底層使用的就是RabbitMQ。
1. 依賴配置
如果按我之前的創建項目方式的話,idea是自動配置了,不需要手動添加,如果需要手動配置的話,需要添加一下依賴。
添加AMQP的啓動器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在application.yml
中添加RabbitMQ地址:
spring:
rabbitmq:
host: 192.168.33.128
username: guest
password: guest
virtual-host: /
2. 監聽者
在SpringAmqp中,對消息的消費者進行了封裝和抽象,一個普通的JavaBean中的普通方法,只要通過簡單的註解,就可以成爲一個消費者。
package com.example.rabbitmq_demo.rabbitmq.spring;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class Listener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "spring.test.queue", durable = "true"),
exchange = @Exchange(
value = "spring.test.exchange",
ignoreDeclarationExceptions = "true",
type = ExchangeTypes.TOPIC
),
key = {"#.#"}))
public void listen(String msg){
System.out.println("接收到消息:" + msg);
}
}
@RabbitListener
:方法上的註解,聲明這個方法是一個消費者方法,需要指定下面的屬性:bindings
:指定綁定關係,可以有多個。值是@QueueBinding
的數組。@QueueBinding
包含下面屬性:value
:這個消費者關聯的隊列。值是@Queue
,代表一個隊列exchange
:隊列所綁定的交換機,值是@Exchange
類型key
:隊列和交換機綁定的RoutingKey
類似listen這樣的方法在一個類中可以寫多個,就代表多個消費者。
3. 發送者 AmqpTemplate
Spring最擅長的事情就是封裝,把他人的框架進行封裝和整合。
Spring爲AMQP提供了統一的消息處理模板:AmqpTemplate,非常方便的發送消息,其發送方法:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RabbitmqDemoApplication.class)
public class MqDemo {
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void testSend() throws InterruptedException {
String msg = "hello, Spring boot amqp -hi 海神號!";
// 參數: 交換機、routingkey、 消息體
this.amqpTemplate.convertAndSend("spring.test.exchange","a.b", msg);
// 等待10秒後再結束
Thread.sleep(10000);
}
}
測試:
運行發送者代碼後,監聽者收到消息:
方式就是這樣,詳細使用還是那幾種消息模型,其他設置也是對rabbitmq的api的封裝,參看spring代碼不難理解。