0、简介
Spring AMQP 提供了几个类,用来声明队列、交换机及其绑定关系:
- Queue:用于声明队列,可用工厂类
QueueBuilder
构建 - Exchange:用于声明交换机,可用工厂类
ExchangeBuilder
构建 - Binding:用于绑定关系,可用工厂类
BindingBuilder
构建
1、基于配置类注册
1.1、Fanout
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRabbitFanoutConfig {
// Exchange 第一种:直接new
@Bean
public FanoutExchange fanoutExchange1(){
return new FanoutExchange("myJavaFanout1");
}
// Exchange 第二种:ExchangeBuilder
@Bean
public FanoutExchange fanoutExchange2(){
return (FanoutExchange)ExchangeBuilder.fanoutExchange("myJavaFanout2").build();
}
// Queue 第一种:直接new :默认是durable
@Bean
public Queue queue1(){
return new Queue("myJavaQueue1");
}
// Queue 第二种:QueueBuilder :durable 持久化 nonDurable:非持久化
@Bean
public Queue queue2(){
return QueueBuilder.durable("myJavaQueue2").build();
}
// Binding 方式一:直接传参
@Bean
public Binding fanoutBinding1(Queue queue1, FanoutExchange fanoutExchange1){
// 直接用 BindingBuilder 方便
return BindingBuilder.bind(queue1).to(fanoutExchange1);
}
// Binding 方式二:直接调用 (通过Spring反向代理获取Bean)
@Bean
public Binding fanoutBinding2(){
return BindingBuilder.bind(queue2()).to(fanoutExchange2());
}
}
1.2、Direct
每绑定一个 routingKey 就得写一个 Bean,基于配置类注册 Direct 交换机就比较麻烦。
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRabbitDirectConfig {
@Bean
public DirectExchange directExchange(){
return new DirectExchange("myJavaDirect");
}
@Bean
public Queue directQueue(){
return new Queue("myJavaDirectQueue1");
}
// 每绑定一个 routingKey 就得写一个 Bean
@Bean
public Binding directKey1Binding(){
return BindingBuilder.bind(directQueue()).to(directExchange()).with("key1");
}
// 每绑定一个 routingKey 就得写一个 Bean
@Bean
public Binding directKey2Binding(){
return BindingBuilder.bind(directQueue()).to(directExchange()).with("key2");
}
}
1.3、Topic
实现与 1.2、Direct 如出一辙,这里不再赘述
2、基于 @RabbitListener 声明
Spring AMPQ 还提供了基于 @RabbitListener
注解来声明队列和交换机的方式。
@Component
public class MyMqConsumerListener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "myQueue666", durable = "true"),
exchange = @Exchange(name = "myExchange666", type = ExchangeTypes.DIRECT),
key = {"key1", "key2"}
))
public void myInitListener(String msg) {
System.err.println("\nmyQueue666接到了来自myExchange666的消息:" + msg);
}
}