上篇講了RabbitMQ連接工廠的作用是用來創(chuàng)建RabbitMQ的連接,本篇就來講講RabbitMQ的發(fā)送消息甘邀。通過RabbitMQ發(fā)送消息最簡單的方式就是將connectionFactory Bean注入到服務(wù)層類中,并使用它創(chuàng)建Connection春叫,使用這個Connection來創(chuàng)建Channel赠堵,再使用這個Channel發(fā)布消息到Exchange中。
當(dāng)然Spring AMQP提供了RabbitTemplate來簡便我們的操作起暮,消除RabbitMQ發(fā)送和接收消息相關(guān)的樣板代碼。使用RabbitTemplate也是先在配置文件中寫相關(guān)的配置会烙,使用Rabbit命名空間的<template>元素负懦,如下:
<template id="rabbitTemplate" connection-factory="connectionFactory">
現(xiàn)在要發(fā)送消息只需要將模板bean注入到服務(wù)層類中(這里以SendServiceImpl為例),并使用它來發(fā)送Spittle持搜,使用RabbitTemplate來發(fā)送Spittle提醒密似,代碼如下:
public class SendServiceImpl implements SendService {
private RabbitTemplate rabbit;
@Autowired
public SendServiceImpl (RabbitTemplate rabbit) {
this.rabbit = rabbit;
}
public void sendSpittle (Spittle spittle) {
rabbit.convertAndSend("spittle.test.exchange", "spittle.test", spittle);
}
}
上面代碼中sendSpittle()調(diào)用RabbitTemplate的convertAndSend()方法,傳入的三個參數(shù)分別是Exchange的名稱葫盼、routing key以及要發(fā)送的對象残腌。
這里如果使用最簡單的只傳要發(fā)送的對象的重載方法,RabbitTemplate就使用默認(rèn)的Exchange和routing key贫导。按之前配置的話抛猫,這兩項默認(rèn)都為空,也可以自行在<template>元素上借助exchange和routing-key屬性配置不同的默認(rèn)值:
<template id="rabbitTemplate" connection-factory="connectionFactory"
exchange="spittle.test.exchange"
routing-key="spittle.test" />
此外RabbitTemplate還有其他方法可以用來發(fā)送消息孩灯,比如用send()方法來發(fā)送org.springframework.amqp.core.Message對象闺金,如下所示:
Message message = new Message("Hello World".getBytes(), new MessageProperties());
rabbit.send("hello.exchange", "hello.routing", message);
使用send()方法的技巧在于構(gòu)造要發(fā)送的Message對象,在上面的例子中峰档,通過給定字符串的字節(jié)數(shù)組來構(gòu)建Message實例败匹。這里是字符串相對比較簡單寨昙,如果消息是復(fù)雜對象的話,則會比較復(fù)雜掀亩。也是因為這樣舔哪,所以一般會用convertAndSend()方法,它會自動將對象轉(zhuǎn)換為Message槽棍,不過它需要一個消息轉(zhuǎn)換器來幫助完成該任務(wù)捉蚤,默認(rèn)的轉(zhuǎn)換器是SimpleMessageConverter,它適用于String炼七、Serializable實例和字節(jié)數(shù)組缆巧。