导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
application.yml
spring:
rabbitmq:
host: 192.168.3.36
username: admin
password: admin
简单模式
AppConfiguration.java
package com.study.rabbitmq.spring.simple;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfiguration {
@Bean
public Queue helloSpring() {
return new Queue("spring.cluster");
}
}
ConsumerApp.java
package com.study.rabbitmq.spring.simple;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.messaging.handler.annotation.Payload;
@Configuration
@EnableAutoConfiguration
@RabbitListener(queues = "spring.cluster")
@Import(AppConfiguration.class)
public class ConsumerApp {
private static final Logger logger = LoggerFactory.getLogger(ConsumerApp.class);
@RabbitHandler
public void receive(@Payload String msg) {
logger.info("收到消息:" + msg);
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
ProducerApp.java
package com.study.rabbitmq.spring.simple;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
public class ProducerApp {
private static final Logger logger = LoggerFactory.getLogger(ProducerApp.class);
@Autowired
private RabbitTemplate template;
@Autowired
private Queue helloSpring;
@Bean
CommandLineRunner runner() {
return args -> {
template.convertAndSend(helloSpring.getName(), "Hello Spring");
logger.info("消息已发送");
};
}
public static void main(String[] args) {
SpringApplication.run(ProducerApp.class, args);
}
}
路由模式
AppConfiguration.java
package com.study.rabbitmq.spring.routing;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class AppConfiguration {
@Bean
public DirectExchange direct() {
return new DirectExchange("spring.direct");
}
@Profile("consumer")
@Bean
public Queue queue() {
return new AnonymousQueue();
}
@Profile("red")
@Bean
public Binding binding1(DirectExchange direct, Queue queue) {
return BindingBuilder.bind(queue).to(direct).with("red");
}
@Profile("yellow")
@Bean
public Binding binding2(DirectExchange direct, Queue queue) {
return BindingBuilder.bind(queue).to(direct).with("yellow");
}
}
ConsumerApp1.java
路由key为red
package com.study.rabbitmq.spring.routing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.messaging.handler.annotation.Payload;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
@RabbitListener(queues = "#{queue.name}")
public class ConsumerApp1 {
private static final Logger logger = LoggerFactory.getLogger(ConsumerApp1.class);
@RabbitHandler
public void receive(@Payload String msg) {
logger.info("收到消息:" + msg);
}
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp1.class);
springApplication.setAdditionalProfiles("consumer", "red");
springApplication.run(args);
}
}
ConsumerApp2.java
路由key为yellow
package com.study.rabbitmq.spring.routing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.messaging.handler.annotation.Payload;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
@RabbitListener(queues = "#{queue.name}")
public class ConsumerApp2 {
private static final Logger logger = LoggerFactory.getLogger(ConsumerApp2.class);
@RabbitHandler
public void receive(@Payload String msg) {
logger.info("收到消息:" + msg);
}
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp2.class);
springApplication.setAdditionalProfiles("consumer", "yellow");
springApplication.run(args);
}
}
ProducerApp.java
package com.study.rabbitmq.spring.routing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
public class ProducerApp {
private static final Logger logger = LoggerFactory.getLogger(ProducerApp.class);
@Autowired
private RabbitTemplate template;
@Autowired
private DirectExchange direct;
@Bean
public CommandLineRunner runner() {
return args -> {
String message = "Hello red";
template.convertAndSend(direct.getName(), "red", message);
logger.info("已发送:" + message);
message = "Hello yellow";
template.convertAndSend(direct.getName(), "yellow", message);
logger.info("已发送:" + message);
};
}
public static void main(String[] args) {
SpringApplication.exit(SpringApplication.run(ProducerApp.class, args));
}
}
运行消费者会产生临时队列
订阅模式
AppConfiguration.java
package com.study.rabbitmq.spring.ps;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class AppConfiguration {
@Bean
public FanoutExchange fanout() {
return new FanoutExchange("spring.fanout");
}
@Profile("consumer")
@Bean
public Queue queue() {
return new AnonymousQueue();
}
@Profile("consumer")
@Bean
public Binding binding(FanoutExchange fanout, Queue queue) {
return BindingBuilder.bind(queue).to(fanout);
}
}
ConsumerApp1.java
package com.study.rabbitmq.spring.ps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.messaging.handler.annotation.Payload;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
@RabbitListener(queues = "#{queue.name}")
public class ConsumerApp1 {
private static final Logger logger = LoggerFactory.getLogger(ConsumerApp1.class);
@RabbitHandler
public void receive(@Payload String msg) {
logger.info("收到消息:" + msg);
}
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp1.class);
springApplication.setAdditionalProfiles("consumer");
springApplication.run(args);
}
}
ConsumerApp2.java
package com.study.rabbitmq.spring.ps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.messaging.handler.annotation.Payload;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
@RabbitListener(queues = "#{queue.name}")
public class ConsumerApp2 {
private static final Logger logger = LoggerFactory.getLogger(ConsumerApp2.class);
@RabbitHandler
public void receive(@Payload String msg) {
logger.info("收到消息:" + msg);
}
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp2.class);
springApplication.setAdditionalProfiles("consumer");
springApplication.run(args);
}
}
ProducerApp.java
package com.study.rabbitmq.spring.ps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
public class ProducerApp {
private static final Logger logger = LoggerFactory.getLogger(ProducerApp.class);
@Autowired
private RabbitTemplate template;
@Autowired
private FanoutExchange fanout;
@Bean
public CommandLineRunner runner() {
return args -> {
for (int i = 0; i < 10; i++) {
StringBuilder builder = new StringBuilder("Hello Spring ");
builder.append(i);
String message = builder.toString();
template.convertAndSend(fanout.getName(), "", message);
logger.info("已发送:" + message);
}
};
}
public static void main(String[] args) {
SpringApplication.exit(SpringApplication.run(ProducerApp.class, args));
}
}
主题模式
AppConfiguration.java
package com.study.rabbitmq.spring.topic;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class AppConfiguration {
@Bean
public TopicExchange topic() {
return new TopicExchange("spring.topic");
}
@Profile("consumer")
@Bean
public Queue queue() {
return new AnonymousQueue();
}
@Profile("#")
@Bean
public Binding binding1(TopicExchange topic, Queue queue) {
return BindingBuilder.bind(queue).to(topic).with("#");
}
@Profile("*.red")
@Bean
public Binding binding2(TopicExchange topic, Queue queue) {
return BindingBuilder.bind(queue).to(topic).with("*.red");
}
@Profile("spring.*")
@Bean
public Binding binding3(TopicExchange topic, Queue queue) {
return BindingBuilder.bind(queue).to(topic).with("spring.*");
}
}
ConsumerApp1.java
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp1.class);
springApplication.setAdditionalProfiles("consumer", "#");
springApplication.run(args);
}
ConsumerApp2.java
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp2.class);
springApplication.setAdditionalProfiles("consumer", "*.red");
springApplication.run(args);
}
ConsumerApp3.java
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp3.class);
springApplication.setAdditionalProfiles("consumer", "spring.*");
springApplication.run(args);
}
ProducerApp.java
package com.study.rabbitmq.spring.topic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration
@Import(AppConfiguration.class)
public class ProducerApp {
private static final Logger logger = LoggerFactory.getLogger(ProducerApp.class);
@Autowired
private RabbitTemplate template;
@Autowired
private TopicExchange topic;
@Bean
public CommandLineRunner runner() {
return args -> {
String message = "Hello spring.red";
template.convertAndSend(topic.getName(), "spring.red", message);
logger.info("已发送:" + message);
message = "Hello spring.yellow";
template.convertAndSend(topic.getName(), "spring.yellow", message);
logger.info("已发送:" + message);
message = "Hello rabbit.red";
template.convertAndSend(topic.getName(), "rabbit.red", message);
logger.info("已发送:" + message);
};
}
public static void main(String[] args) {
SpringApplication.exit(SpringApplication.run(ProducerApp.class, args));
}
}