依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置
spring:
rabbitmq:
host: 192.168.18.130
port: 5672
username: admin
password: admin
#virtualHost: /
生产者确认机制,确保消息正确发送,如果发送失败会有错误回执,从而触发重试
spring:
rabbitmq:
publisher-confirms: true
Config类
定义RabbitConfig类,配置Exchange、Queue、及绑定交换机。本例配置Topic交换机。
@Configuration
public class RabbitmqConfig {
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";
@Bean(EXCHANGE_TOPICS_INFORM)
public Exchange EXCHANGE_TOPICS_INFORM() {
//durable(true)持久化,消息队列重启后交换机仍然存在
return ExchangeBuilder.topicExchange(EXCHANGE_TOPICS_INFORM).durable(true).build();
}
//声明队列
@Bean(QUEUE_INFORM_SMS)
public Queue QUEUE_INFORM_SMS() {
Queue queue = new Queue(QUEUE_INFORM_SMS);
return queue;
}
//声明队列
@Bean(QUEUE_INFORM_EMAIL)
public Queue QUEUE_INFORM_EMAIL() {
Queue queue = new Queue(QUEUE_INFORM_EMAIL);
return queue;
}
//channel.queueBind(INFORM_QUEUE_SMS,"inform_exchange_topic","inform.#.sms.#"); * 绑定队列到交换机
@Bean
public Binding BINDING_QUEUE_INFORM_SMS(@Qualifier(QUEUE_INFORM_SMS) Queue queue,
@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("inform.#.sms.#").noargs();
}
@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("inform.#.email.#").noargs();
}
}
语法
生产端,使用RarbbitTemplate发送消息
消费端,使用@RabbitListener注解监听队列。
@RabbitListener
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@MessageMapping
@Documented
@Repeatable(RabbitListeners.class)
public @interface RabbitListener {
String id() default "";
String containerFactory() default "";
String[] queues() default {};
Queue[] queuesToDeclare() default {};
boolean exclusive() default false;
String priority() default "";
String admin() default "";
QueueBinding[] bindings() default {};
String group() default "";
String returnExceptions() default "";
String errorHandler() default "";
String concurrency() default "";
String autoStartup() default "";
String executor() default "";
String ackMode() default "";
String replyPostProcessor() default "";
}
@RabbitListener包含很多内容,在发布订阅模式中,我们可以使用其中的“QueueBinding[] bindings”,其中QueueBinding底层如下:
@Target({})
@Retention(RetentionPolicy.RUNTIME)
public @interface QueueBinding {
Queue value();
Exchange exchange();
String[] key() default {};
String ignoreDeclarationExceptions() default "false";
Argument[] arguments() default {};
String declare() default "true";
String[] admins() default {};
}
其中Queue表示队列,Exchange表示交换机,key表示Routing Key
@Queue会创建队列
@Exchange会创建交换机
@QueueBinding会绑定队列和交换机