Direct交换器-编写生产者
生活随笔
收集整理的這篇文章主要介紹了
Direct交换器-编写生产者
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們來編寫消息的生產(chǎn)者,Provider,回到我們的代碼當(dāng)中,Provider配置文件已經(jīng)配置好了,在這里Receiver就不要了,只要Sender就可以了,然后我們來看一下Sender的代碼,這是我們之前寫的案例,那么在這里我們需要注意的是什么呢,現(xiàn)在我們需要注入兩個(gè)配置文件里面的內(nèi)容了,看配置文件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在這里是不是有一個(gè)交換器的名稱,Provider生產(chǎn)者他在發(fā)送消息的時(shí)候,是不是得知道像哪個(gè)交換器發(fā)送消息,所以他在這里也需要知道交換器的名稱,那么我們也需要把它給注入進(jìn)來// exchange 交換器名稱
@Value("${mq.config.exchange}")
private String exchange;然后還要告訴他是按照哪個(gè)路徑key去發(fā)送,所以路由key也要,這里我們先給一個(gè)info,// routingkey 路由鍵
@Value("${mq.config.queue.error.routing.key}")
private String routingkey;我們加一個(gè)注釋,那么為什么發(fā)送消息要用到這兩個(gè)值呢,我們?nèi)フ{(diào)用rabbitAmqpTemplate下的convertAndSend方法,來做消息發(fā)送,實(shí)質(zhì)在template下,在convertAndSend方法當(dāng)中呢,它是一個(gè)重載的方法,他在這里還需要三個(gè)參數(shù)的,那么需要三個(gè)參數(shù)的convertAndSend,那么三個(gè)參數(shù)表示什么意思呢,這個(gè)時(shí)候參數(shù)一不再是隊(duì)列名稱了,而是我們的交換器名稱,第二個(gè)參數(shù)是什么呢,第二個(gè)參數(shù)是路由鍵,參數(shù)三是什么呢,是我們的消息,這樣生產(chǎn)者和消費(fèi)者,會(huì)根據(jù)我們的名稱,路由鍵,將消息發(fā)送到我們的RabbitMQ當(dāng)中,就跟著交換器以及路由規(guī)則,發(fā)送到RabbitMQ當(dāng)中,RabbitMQ根據(jù)你發(fā)送過來的消息,他的交換器,跟你傳過來的路由鍵,就會(huì)將消息放到不同的隊(duì)列當(dāng)中,就從隊(duì)列里去消息,這個(gè)能理解吧,那么我們來把這幾個(gè)參數(shù)給定,this.exchange就是交換器的名稱,第二個(gè)是this.routerKey,就是路由鍵,第三個(gè)是消息msg,這樣我們一個(gè)發(fā)送者的代碼就寫完了,其實(shí)對于發(fā)送方來講,比較簡單,主要知道交換器的名稱,和路由鍵就可以,那么接下來我們?nèi)y試一下@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;/** 發(fā)送消息的方法*/public void send(String msg){//向消息隊(duì)列發(fā)送消息//參數(shù)一:交換器名稱。//參數(shù)二:路由鍵//參數(shù)三:消息this.rabbitAmqpTemplate.convertAndSend(this.exchange, this.routingkey, msg);}
}測試代碼基本我們不用動(dòng)什么,這里我們看一下,我們現(xiàn)在給的路由鍵是不是info,那么也就意味著消息就發(fā)送到這個(gè)隊(duì)列當(dāng)中,那么對于INFO處理日志的這個(gè),是不是能夠從這里讀到信息,他是不是能夠讀到信息,他會(huì)打印info...receiver內(nèi)容,是代表我們的代碼編寫是沒有問題的,我們來測試一下,首先我們把消費(fèi)者啟動(dòng),然后再去運(yùn)行發(fā)送消息的代碼,觀察控制臺(tái),看到了嗎,現(xiàn)在由于我們的給的路由key,給的是info.routing.key,所以現(xiàn)在產(chǎn)生的是info的消息,我們把生產(chǎn)者先停掉,我們把sender再改一個(gè),我們把路由鍵改成error,我們在配置文件里,error的路由鍵拿過來mq.config.queue.error.routing.key=log.error.routing.key放到這里我們來測試一下,回到我們的Sender當(dāng)中,他就能從key里取出值了,這里給的就是error級別的路由鍵,我們現(xiàn)在再來運(yùn)行,消費(fèi)者已經(jīng)啟動(dòng)了,我們再來測試,現(xiàn)在我再運(yùn)行,因?yàn)槲覀兘o的路由key就是error的,那么現(xiàn)在我們消費(fèi)者這一塊,他的ErrorReceiver是不是能夠執(zhí)行,打印Error....Receiver,我們來看看是不是這樣的,觀察控制臺(tái),我們可以看到,現(xiàn)在是不是輸出Error隊(duì)列的一個(gè)消息,所以我們這個(gè)案例當(dāng)中呢,就是通過交換器,注意看匹配模式,用的是direct,發(fā)布訂閱的方式,這一類交換器,不同的消息進(jìn)入到不同的隊(duì)列當(dāng)中,然后不同的消費(fèi)者,從不同的隊(duì)列里取消息的案例,這個(gè)案例主要是Direct交換器的講解,關(guān)鍵在哪呢,一個(gè)是你發(fā)送消息時(shí),我要指定的交換器的名稱,那么交換器的名稱你還要保證,消費(fèi)者里面,他的名稱是相同的,第二個(gè)就是配置消息消費(fèi)者這一塊,@RabbitListener注解里,這一塊是相當(dāng)重要的,關(guān)鍵是在這,type是ExchangeTypes,我們現(xiàn)在把消費(fèi)者的代碼整理一下,消息生產(chǎn)者的代碼有所改動(dòng),我們加到這里,加了一個(gè)Error的路由器,然后下面代碼,主要是Sender這一塊,就是我們發(fā)送消息的方法有變化,調(diào)用convertAndSend需要三個(gè)參數(shù)的方法,以上對于direct交換器的講解呢,就已經(jīng)結(jié)束了,下面我們再來講其他的交換器
<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><!-- 這個(gè)插件,可以將應(yīng)用打包成一個(gè)可執(zhí)行的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;/*** 消息發(fā)送者* @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;/** 發(fā)送消息的方法*/public void send(String msg){//向消息隊(duì)列發(fā)送消息//參數(shù)一:交換器名稱。//參數(shù)二:路由鍵//參數(shù)三:消息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;/*** 消息隊(duì)列測試類* @author Administrator**/
@RunWith(SpringRunner.class)
@SpringBootTest(classes=RabbitDirectProviderApplication.class)
public class QueueTest {@Autowiredprivate Sender sender;/** 測試消息隊(duì)列*/@Testpublic void test1()throws Exception{while(true){Thread.sleep(1000);this.sender.send("Hello RabbitMQ");}}
}
?
總結(jié)
以上是生活随笔為你收集整理的Direct交换器-编写生产者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Direct交换器-编写消费者
- 下一篇: Topic交换器-搭建环境