常見交換機
RabbitMQ提供的交換機一共的四種,分別是:
1. Fanout:采用廣播形式來發送消息,會將消息路由到所有綁定了的隊列之中。
2. Direct:通過Binding Key與隊列綁定,生產者在發送信息的時候會通過Routing Key來告訴交換機消息要發送給誰
3. Topic:與Direct類似,但是Topic支持通配符,能夠使用通配符實現多匹配,一般情況下Binding Key是由多個單詞組成,而Topic能夠通過#和*來模糊匹配,#代表多個單詞,*代表一個單詞
4.?Headers :根據消息頭進行匹配,基本上很少使用,限制較多,而且麻煩
Fanout 扇形交換機
import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class FanoutConfig {// 定義隊列名稱public static final String FANOUT_QUEUE_1 = "fanout.queue.1";public static final String FANOUT_QUEUE_2 = "fanout.queue.2";// 定義交換機名稱public static final String FANOUT_EXCHANGE = "fanout.exchange";/*** 聲明第一個隊列*/@Beanpublic Queue fanoutQueue1() {return new Queue(FANOUT_QUEUE_1);}/*** 聲明第二個隊列*/@Beanpublic Queue fanoutQueue2() {return new Queue(FANOUT_QUEUE_2);}/*** 聲明一個扇出交換機*/@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange(FANOUT_EXCHANGE);}/*** 將第一個隊列綁定到扇出交換機*/@Beanpublic Binding fanoutBinding1() {return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchange());}/*** 將第二個隊列綁定到扇出交換機*/@Beanpublic Binding fanoutBinding2() {return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange());} }
Direct 直連交換機
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 DirectConfig {// 定義隊列名稱public static final String DIRECT_QUEUE = "direct.queue";// 定義交換機名稱public static final String DIRECT_EXCHANGE = "direct.exchange";// 定義路由鍵public static final String DIRECT_ROUTING_KEY = "direct.routing.key";/*** 聲明一個隊列*/@Beanpublic Queue directQueue() {return new Queue(DIRECT_QUEUE);}/*** 聲明一個直連交換機*/@Beanpublic DirectExchange directExchange() {return new DirectExchange(DIRECT_EXCHANGE);}/*** 將隊列綁定到交換機,并指定路由鍵*/@Beanpublic Binding directBinding() {return BindingBuilder.bind(directQueue()).to(directExchange()).with(DIRECT_ROUTING_KEY);} }
Topic 主題交換機
import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.TopicExchange; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class TopicConfig {// 定義隊列名稱public static final String TOPIC_QUEUE_1 = "topic.queue.1";public static final String TOPIC_QUEUE_2 = "topic.queue.2";// 定義交換機名稱public static final String TOPIC_EXCHANGE = "topic.exchange";// 定義路由鍵模式public static final String TOPIC_ROUTING_KEY_1 = "topic.routing.key.1.*";public static final String TOPIC_ROUTING_KEY_2 = "topic.routing.key.2.#";/*** 聲明第一個隊列*/@Beanpublic Queue topicQueue1() {return new Queue(TOPIC_QUEUE_1);}/*** 聲明第二個隊列*/@Beanpublic Queue topicQueue2() {return new Queue(TOPIC_QUEUE_2);}/*** 聲明一個主題交換機*/@Beanpublic TopicExchange topicExchange() {return new TopicExchange(TOPIC_EXCHANGE);}/*** 將第一個隊列綁定到主題交換機,并指定路由鍵模式*/@Beanpublic Binding topicBinding1() {return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(TOPIC_ROUTING_KEY_1);}/*** 將第二個隊列綁定到主題交換機,并指定路由鍵模式*/@Beanpublic Binding topicBinding2() {return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(TOPIC_ROUTING_KEY_2);} }
Headers 頭交換機
import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.HeadersExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import java.util.HashMap; import java.util.Map;@Configuration public class HeadersConfig {// 定義隊列名稱public static final String HEADERS_QUEUE_1 = "headers.queue.1";public static final String HEADERS_QUEUE_2 = "headers.queue.2";// 定義交換機名稱public static final String HEADERS_EXCHANGE = "headers.exchange";/*** 聲明第一個隊列*/@Beanpublic Queue headersQueue1() {return new Queue(HEADERS_QUEUE_1);}/*** 聲明第二個隊列*/@Beanpublic Queue headersQueue2() {return new Queue(HEADERS_QUEUE_2);}/*** 聲明一個頭交換機*/@Beanpublic HeadersExchange headersExchange() {return new HeadersExchange(HEADERS_EXCHANGE);}/*** 將第一個隊列綁定到頭交換機,并指定頭部屬性*/@Beanpublic Binding headersBinding1() {Map<String, Object> headers = new HashMap<>();headers.put("header1", "value1");return BindingBuilder.bind(headersQueue1()).to(headersExchange()).whereAny(headers).match();}/*** 將第二個隊列綁定到頭交換機,并指定頭部屬性*/
注意點:
在我測試的過程中,發現在創建的過程中并不會直接去創建,而是在你讀取隊列后才會被創建,哪怕這個隊列不存在,報錯了,也會創建交換機和隊列并綁定