前言
RabbitMQ單獨使用的場景現在非常少,基本都是整合在Spring中,接下來我們就針對SpringBoot如何整合RabbitMQ進行說明
整合
1. 導入依賴包(Gradle)
compile('org.springframework.boot:spring-boot-starter-amqp')
2. 配置文件設置(application.properties)
spring.rabbitmq.host=47.105.72.224 spring.rabbitmq.port=5672 spring.rabbitmq.username=rabbitmq spring.rabbitmq.password=rabbitmq spring.rabbitmq.virtual-host=/my
3. SpringBoot提供和模板對象(RabbitTemplate)。
4. 案例1: 直連。
生產者:
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class ProviderMQ { @Autowired RabbitTemplate rabbitTemplate; public void sendMessage(){ rabbitTemplate.convertAndSend("hello","hello world!"); } }
消費者:SpringBoot啓動自動會創建線程監聽消息
import org.springframework.amqp.rabbit.annotation.Queue; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * 使用註解設置隊列:@Queue * value 爲隊列名 * durable 爲是否持久化 默認值是true * autoDelete 是否自動刪除隊列 默認值是false */ @Component @RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "true",autoDelete = "true")) public class CustomerMQ { @RabbitHandler public void receiveMessage(String message){ System.out.println("接收到的消息:"+message); } }
測試類:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.concurrent.TimeoutException; @RestController public class Test { @Autowired ProviderMQ provider; @RequestMapping("/Send.do") public String workSend() throws IOException, TimeoutException { provider.sendMessage(); return "success"; } }
運行結果:
案例2: work queue
生產者:
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class WorkProviderMQ { @Autowired RabbitTemplate rabbitTemplate; public void sendMessage(){ for (int i = 0; i < 10; i++) { rabbitTemplate.convertAndSend("work","第"+i+"個消息:hello work!"); } } }
消費者:
import org.springframework.amqp.rabbit.annotation.Queue; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * 使用註解設置隊列:@Queue * value 爲隊列名 * durable 爲是否持久化 默認值是true * autoDelete 是否自動刪除隊列 默認值是false */ @Component public class WorkCustomerMQ { @RabbitListener(queuesToDeclare = @Queue(value = "work")) public void receiveMessage1(String message){ System.out.println("接收到的消息1:"+message); } @RabbitListener(queuesToDeclare = @Queue(value = "work")) public void receiveMessage2(String message){ System.out.println("接收到的消息2:"+message); } }
運行結果:
案例3: 廣播(fanout)
生產者:
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class FanoutProviderMQ { @Autowired RabbitTemplate rabbitTemplate; public void sendMessage(){ rabbitTemplate.convertAndSend("fanoutMessage","","fanout消息:hello fanout!"); } }
消費者:
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; /** * 使用註解設置隊列:@Queue * value 爲隊列名 * durable 爲是否持久化 默認值是true * autoDelete 是否自動刪除隊列 默認值是false */ @Component public class FanoutCustomerMQ { /** * @Queue 不加value 表示臨時隊列 * @param message */ @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "fanoutMessage",type = "fanout"))}) public void receiveMessage1(String message){ System.out.println("接收到的消息1:"+message); } @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "fanoutMessage",type = "fanout"))}) public void receiveMessage2(String message){ System.out.println("接收到的消息2:"+message); } }
運行結果:
案例4: 訂閱(Routing)
生產者:
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class DirectProviderMQ { @Autowired RabbitTemplate rabbitTemplate; public void sendMessage(){ rabbitTemplate.convertAndSend("directMessage","info","direct消息:hello info!"); rabbitTemplate.convertAndSend("directMessage","error","direct消息:hello error!"); rabbitTemplate.convertAndSend("directMessage","warn","direct消息:hello warn!"); } }
消費者:
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; /** * 使用註解設置隊列:@Queue * value 爲隊列名 * durable 爲是否持久化 默認值是true * autoDelete 是否自動刪除隊列 默認值是false */ @Component public class DirectCustomerMQ { /** * @Queue 不加value 表示臨時隊列 * type = "direct" direct 是默認模式 * @param message */ @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directMessage",type = "direct"),key = {"info","error"})}) public void receiveMessage1(String message){ System.out.println("接收到的消息1:"+message); } @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directMessage",type = "direct"),key = {"warn"})}) public void receiveMessage2(String message){ System.out.println("接收到的消息2:"+message); } }
運行結果:
案例5:動態訂閱(Topic)
生產者:
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class TopicProviderMQ { @Autowired RabbitTemplate rabbitTemplate; public void sendMessage(){ rabbitTemplate.convertAndSend("topicMessage","user.info","direct消息:hello user.info!"); rabbitTemplate.convertAndSend("topicMessage","user.error","direct消息:hello user.error!"); rabbitTemplate.convertAndSend("topicMessage","user.warn","direct消息:hello user.warn!"); rabbitTemplate.convertAndSend("topicMessage","user.warn.message","direct消息:hello user.warn.message!"); } }
消費者:
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; /** * 使用註解設置隊列:@Queue * value 爲隊列名 * durable 爲是否持久化 默認值是true * autoDelete 是否自動刪除隊列 默認值是false */ @Component public class TopicCustomerMQ { /** * @Queue 不加value 表示臨時隊列 * type = "direct" direct 是默認模式 * @param message */ @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "topicMessage",type = "topic"),key = {"*.info"})}) public void receiveMessage1(String message){ System.out.println("接收到的消息1:"+message); } @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "topicMessage",type = "topic"),key = {"user.*"})}) public void receiveMessage2(String message){ System.out.println("接收到的消息2:"+message); } @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "topicMessage",type = "topic"),key = {"user.#"})}) public void receiveMessage3(String message){ System.out.println("接收到的消息3:"+message); } }
運行結果:
總結
1. SpringBoot 整合RabbitMQ步驟。
2. 簡化了配置邏輯。
3. 啓動系統,消費者也自動被啓動。
4. Spring提供了RabbitTemplate來封裝MQ,最終簡化我們代碼。
5. 相關注解需要掌握。