1.1 搭建SpringBoot環(huán)境
我們選擇基于Spring-Rabbit去操作RabbitMQ
https://github.com/spring-projects/spring-amqp
使用spring-boot-starter-amqp會自動添加spring-rabbit依賴茵休,
1.2配置
1驱闷、配置application.yml
配置連接rabbitmq的參數(shù)
server:
port: 44000
spring:
application:
name: test‐rabbitmq‐consumer
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtualHost: /
2鲤妥、定義RabbitConfig類怕敬,配置Exchange蔚鸥、Queue斗埂、及綁定交換機塞琼。
本例配置Topic交換機坎炼。
@Configuration
public class RabbitConfig {
public static final String QUEUE_INFORM_EMAIL = "queue_inform_email";
public static final String QUEUE_INFORM_SMS = "queue_inform_sms";
public static final String EXCHANGE_TOPICS_INFORM="exchange_topics_inform";
public static final String ROUTINGKEY_EMAIL="inform.#.email.#";
public static final String ROUTINGKEY_SMS="inform.#.sms.#";
//聲明交換機
@Bean(EXCHANGE_TOPICS_INFORM)
public Exchange EXCHANGE_TOPICS_INFORM(){
//durable(true) 持久化愧膀,mq重啟之后交換機還在
return ExchangeBuilder.topicExchange(EXCHANGE_TOPICS_INFORM).durable(true).build();
}
//聲明QUEUE_INFORM_EMAIL隊列
@Bean(QUEUE_INFORM_EMAIL)
public Queue QUEUE_INFORM_EMAIL(){
return new Queue(QUEUE_INFORM_EMAIL);
}
//聲明QUEUE_INFORM_SMS隊列
@Bean(QUEUE_INFORM_SMS)
public Queue QUEUE_INFORM_SMS(){
return new Queue(QUEUE_INFORM_SMS);
}
// 每個消費者監(jiān)聽自己的隊列,并且設(shè)置routingkey谣光。
//生產(chǎn)者將消息發(fā)給交換機檩淋,由交換機根據(jù)routingkey來轉(zhuǎn)發(fā)消息到指定的隊列
//ROUTINGKEY_EMAIL隊列綁定交換機,指定routingKey
@Bean
public Binding BINDING_QUEUE_INFORM_EMAIL(@Qualifier(QUEUE_INFORM_EMAIL) Queue queue,
@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_EMAIL).noargs();
}
//ROUTINGKEY_SMS隊列綁定交換機萄金,指定routingKey
@Bean
public Binding BINDING_ROUTINGKEY_SMS(@Qualifier(QUEUE_INFORM_SMS) Queue queue,
@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_SMS).noargs();
}
}
1.3 生產(chǎn)端
@SpringBootTest
@RunWith(SpringRunner.class)
public class Producer04_topics_Boot {
@Autowired
RabbitTemplate rabbitTemplate;
//使用rabbitTemplate發(fā)送消息
@Test
public void testSendEmail(){
String message = "send email message to user";
/**
* 參數(shù):
* 1蟀悦、交換機名稱
* 2、routingKey
* 3氧敢、消息內(nèi)容
*/
rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_TOPICS_INFORM,"inform.email",message);
}
1.4消費端
目錄結(jié)構(gòu)與生產(chǎn)者一樣
使用@RabbitListener注解監(jiān)聽隊列日戈。
@Component
public class ReceiveHandler {
@RabbitListener(queues = {RabbitConfig.QUEUE_INFORM_EMAIL})
public void emil(String msg, Message message , Channel channel){
System.out.println(msg);
}
}