Direct交换器-编写生产者
生活随笔
收集整理的這篇文章主要介紹了
Direct交换器-编写生产者
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們來編寫消息的生產者,Provider,回到我們的代碼當中,Provider配置文件已經配置好了,在這里Receiver就不要了,只要Sender就可以了,然后我們來看一下Sender的代碼,這是我們之前寫的案例,那么在這里我們需要注意的是什么呢,現在我們需要注入兩個配置文件里面的內容了,看配置文件mq.config.exchange=log.direct
mq.config.queue.info.routing.key=log.info.routing.key
mq.config.queue.error.routing.key=log.error.routing.key
mq.config.queue.error=log.error在這里是不是有一個交換器的名稱,Provider生產者他在發送消息的時候,是不是得知道像哪個交換器發送消息,所以他在這里也需要知道交換器的名稱,那么我們也需要把它給注入進來// exchange 交換器名稱
@Value("${mq.config.exchange}")
private String exchange;然后還要告訴他是按照哪個路徑key去發送,所以路由key也要,這里我們先給一個info,// routingkey 路由鍵
@Value("${mq.config.queue.error.routing.key}")
private String routingkey;我們加一個注釋,那么為什么發送消息要用到這兩個值呢,我們去調用rabbitAmqpTemplate下的convertAndSend方法,來做消息發送,實質在template下,在convertAndSend方法當中呢,它是一個重載的方法,他在這里還需要三個參數的,那么需要三個參數的convertAndSend,那么三個參數表示什么意思呢,這個時候參數一不再是隊列名稱了,而是我們的交換器名稱,第二個參數是什么呢,第二個參數是路由鍵,參數三是什么呢,是我們的消息,這樣生產者和消費者,會根據我們的名稱,路由鍵,將消息發送到我們的RabbitMQ當中,就跟著交換器以及路由規則,發送到RabbitMQ當中,RabbitMQ根據你發送過來的消息,他的交換器,跟你傳過來的路由鍵,就會將消息放到不同的隊列當中,就從隊列里去消息,這個能理解吧,那么我們來把這幾個參數給定,this.exchange就是交換器的名稱,第二個是this.routerKey,就是路由鍵,第三個是消息msg,這樣我們一個發送者的代碼就寫完了,其實對于發送方來講,比較簡單,主要知道交換器的名稱,和路由鍵就可以,那么接下來我們去測試一下@Component
public class Sender {@Autowiredprivate AmqpTemplate rabbitAmqpTemplate;//exchange 交換器名稱@Value("${mq.config.exchange}")private String exchange;//routingkey 路由鍵@Value("${mq.config.queue.error.routing.key}")private String routingkey;/** 發送消息的方法*/public void send(String msg){//向消息隊列發送消息//參數一:交換器名稱。//參數二:路由鍵//參數三:消息this.rabbitAmqpTemplate.convertAndSend(this.exchange, this.routingkey, msg);}
}測試代碼基本我們不用動什么,這里我們看一下,我們現在給的路由鍵是不是info,那么也就意味著消息就發送到這個隊列當中,那么對于INFO處理日志的這個,是不是能夠從這里讀到信息,他是不是能夠讀到信息,他會打印info...receiver內容,是代表我們的代碼編寫是沒有問題的,我們來測試一下,首先我們把消費者啟動,然后再去運行發送消息的代碼,觀察控制臺,看到了嗎,現在由于我們的給的路由key,給的是info.routing.key,所以現在產生的是info的消息,我們把生產者先停掉,我們把sender再改一個,我們把路由鍵改成error,我們在配置文件里,error的路由鍵拿過來mq.config.queue.error.routing.key=log.error.routing.key放到這里我們來測試一下,回到我們的Sender當中,他就能從key里取出值了,這里給的就是error級別的路由鍵,我們現在再來運行,消費者已經啟動了,我們再來測試,現在我再運行,因為我們給的路由key就是error的,那么現在我們消費者這一塊,他的ErrorReceiver是不是能夠執行,打印Error....Receiver,我們來看看是不是這樣的,觀察控制臺,我們可以看到,現在是不是輸出Error隊列的一個消息,所以我們這個案例當中呢,就是通過交換器,注意看匹配模式,用的是direct,發布訂閱的方式,這一類交換器,不同的消息進入到不同的隊列當中,然后不同的消費者,從不同的隊列里取消息的案例,這個案例主要是Direct交換器的講解,關鍵在哪呢,一個是你發送消息時,我要指定的交換器的名稱,那么交換器的名稱你還要保證,消費者里面,他的名稱是相同的,第二個就是配置消息消費者這一塊,@RabbitListener注解里,這一塊是相當重要的,關鍵是在這,type是ExchangeTypes,我們現在把消費者的代碼整理一下,消息生產者的代碼有所改動,我們加到這里,加了一個Error的路由器,然后下面代碼,主要是Sender這一塊,就是我們發送消息的方法有變化,調用convertAndSend需要三個參數的方法,以上對于direct交換器的講解呢,就已經結束了,下面我們再來講其他的交換器
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn</groupId><artifactId>rabbitmq-direct-provider</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version><relativePath/> </parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><thymeleaf.version>3.0.9.RELEASE</thymeleaf.version><thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version></properties><dependencies><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.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 這個插件,可以將應用打包成一個可執行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
spring.application.name=rabbitmq-direct-providerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=log.direct
mq.config.queue.info.routing.key=log.info.routing.key
mq.config.queue.error.routing.key=log.error.routing.key
mq.config.queue.error=log.error
package com.learn;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 消息發送者* @author Administrator**/
@Component
public class Sender {@Autowiredprivate AmqpTemplate rabbitAmqpTemplate;//exchange 交換器名稱@Value("${mq.config.exchange}")private String exchange;//routingkey 路由鍵@Value("${mq.config.queue.error.routing.key}")private String routingkey;/** 發送消息的方法*/public void send(String msg){//向消息隊列發送消息//參數一:交換器名稱。//參數二:路由鍵//參數三:消息this.rabbitAmqpTemplate.convertAndSend(this.exchange, this.routingkey, msg);}
}
package com.learn;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class RabbitDirectProviderApplication {public static void main(String[] args) {SpringApplication.run(RabbitDirectProviderApplication.class, args);}
}
package com.learn.test;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import com.learn.RabbitDirectProviderApplication;
import com.learn.Sender;/*** 消息隊列測試類* @author Administrator**/
@RunWith(SpringRunner.class)
@SpringBootTest(classes=RabbitDirectProviderApplication.class)
public class QueueTest {@Autowiredprivate Sender sender;/** 測試消息隊列*/@Testpublic void test1()throws Exception{while(true){Thread.sleep(1000);this.sender.send("Hello RabbitMQ");}}
}
?
總結
以上是生活随笔為你收集整理的Direct交换器-编写生产者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Direct交换器-编写消费者
- 下一篇: Topic交换器-搭建环境