在學習了RabbitMq之後,我們知道當打開RabbitMq服務時,訪問15672
端口可以進入web管理界面,並且可以在裏面操作,如發送消息,從某個隊列中接受消息。但是我們平時在程序實際運行中,不可能一直手動地來完成這些操作(因爲我們不知道什麼時候需要發送接受消息,而且這樣效率很低)。在基於消息隊列的程序中,我們需要編寫程序來完成從消息隊列自動收發消息的操作,這一篇就來記錄怎麼使用java來完成這一操作
在此之前我們現在web管理界面創建好一些exchange
和queue
,並且綁定好它們之間的路由規則。
exchange
:
queue
:
綁定規則這裏略。
接着需要引入一個maven依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
引入之後就可以操作RabbitMq了,這裏要介紹一個類RabbitTemplate
,顧名思義,這個類的作用和JdbcTemplate
、RedisTemplate
作用大致相同,只不過操作的是RabbitMq。接下來我們就要去使用它。
在我們引入maven相關依賴後,SpringBoot會自動幫我們注入RabbitTemplate
,在RabbitAutoConfiguration中可以看到相關源碼:
@Bean //幫我們注入了該對象,可以直接使用
@ConditionalOnSingleCandidate(ConnectionFactory.class)
@ConditionalOnMissingBean({RabbitOperations.class})
public RabbitTemplate rabbitTemplate(RabbitProperties properties, ObjectProvider<MessageConverter> messageConverter, ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers, ConnectionFactory connectionFactory) {
在測試類中編寫方法進行測試:
@SpringBootTest
class SpringRabbitmqApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void contextLoads() {
rabbitTemplate.convertAndSend("exchange.direct","leslie",new User("leslie","1234567"));
}
}
rabbitTemplate的convertAndSend()
方法可以給指定隊列發送消息,函數有三個參數,第一個是**交換機(exchange)的名字,第二個是路由鍵(routing-key)**的名字,第三個則爲消息的內容。 我們這裏給名叫exchange.direct的交換機發送一個User對象,其中路由鍵爲leslie
,因爲交換機類型是direct
,所以是點對點的消息隊列,只會發送到名叫leslie
的隊列中,運行程序,去web管理界面查看是否發送成功:
可以看到消息以及發送成功了,只不過它把我們消息的內容序列化了,這裏因爲它默認使用的還是jdk的序列化,和之前介紹redis
時一樣,我們需要把它的默認序列化器更改爲json類型的序列化器(可以翻看以前的博客)。
這裏直接說方法,直接編寫一個配置類,並往容器內注入MessageConverter
接口的實現類對象:
@Configuration
public class RabbitMqConfiguration {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
其中返回的Jackson2JsonMessageConverter
其實就是我們需要的json類型的序列化器,當容器中有MessageConverter
類型的組件時,SpringBoot就會調用我們自己編寫的序列化器了,接着在運行一次,在web管理界面查看消息:
可以看到以及成功轉爲json類型的數據了,這樣觀看更加直觀。
接着介紹RabbitTemplate
的另外一個方法,我們說完發消息,那肯定需要一個取消息了,receiveAndConvert()
方法用來取消息,裏面有一個參數是隊列(queue)的名字,表示要從那個隊列中取數據
在測試方法的後面加上:
Object leslie = rabbitTemplate.receiveAndConvert("leslie");
System.out.println(leslie);
它的返回值是object類型的,當然也可以強轉,這裏就省略了,我們看看運行,看看控制檯是否有顯示:
可以看到操作成功.
在導入maven相關依賴後,它不僅幫我們注入了RabbitTemplate
對象用來操作RabbitMq發送接受消息,還幫我們注入了AcmqAdmin
對象用來管理RabbitMq,它的作用是創建一些exchange
、queue
或者移動,刪除它們。具體的操作可以查看它類上的方法命名去使用它們,這裏不做介紹了。