1 四种交换机
1direct
2topic
3 fanout
4header
1.1direct 方式
1.1.1 生产者
1.1.1.1 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
1.1.1.2 yml.xml添加配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
1.1.1.3 配置类
@Configuration
public class EmailConfig {
@Bean
DirectExchange EmailExchange()
{
return new DirectExchange("EmailExchange");
}
}
1.1.1.4controller
@RestController
@RequestMapping("amqp")
public class AmqpController {
@Autowired
RabbitTemplate template;
@GetMapping("/direct")
public String sendEmail(@RequestParam Map<String, Object> params)
{
String msg = params.get("msg").toString();
template.convertAndSend("EmailExchange", "EmailRouting", msg);
return "OK";
}
}
1.1.2消费者
1.1.2.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
1.1.2.2 yml.xml添加配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
1.1.2.3 配置类
队列绑定到交换机上
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EmailConfig {
@Bean
DirectExchange EmailExchange()
{
return new DirectExchange("EmailExchange");
}
@Bean
Queue EmailQueue()
{
return new Queue("EmailQueue");
}
@Bean
Binding BindEmail()
{
return BindingBuilder.bind(EmailQueue()).to(EmailExchange()).with("EmailRouting");
}
}
1.1.2.4 监听类
@Component
public class EmailReceiver {
@RabbitListener(queues = "EmailQueue")
public void receiver(String msg)
{
System.out.println("收到的消息是:" + msg);
}
}
1.1.3使用
先启动消费端,在启动生产者,
调用生产者的controller接口,
看消费者的控制台
1.2topic
1.2.1 生产者
1.2.1.1config
@Configuration
public class BlogConfig {
@Bean
TopicExchange BlogExchange()
{
return new TopicExchange("BlogExchange");
}
}
1.2.1.2 controller
@GetMapping("/topic")
public String sendBlog(@RequestParam Map<String, Object> params)
{
String msg = params.get("msg").toString();
String routingKey = params.get("key").toString();
template.convertAndSend("BlogExchange", routingKey, msg);
return "OK";
}
1.2.2 消费者
1.2.2.1config
package fastwave.cloud.demo.fastwavebizsubscriber.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BlogConfig {
@Bean
TopicExchange BlogExchange()
{
return new TopicExchange("BlogExchange");
}
@Bean
Queue BlogJavaQueue()
{
return new Queue("BlogJavaQueue", true);
}
@Bean
Queue BlogDotNetQueue()
{
return new Queue("BlogDotNetQueue", true);//持久化,防止消息的丢失
}
@Bean
Queue BlogAllQueue()
{
return new Queue("BlogAllQueue", true);
}
@Bean
Binding BindingToJavaQueue()
{
return BindingBuilder.bind(BlogJavaQueue()).to(BlogExchange()).with("blog.java");
}
@Bean
Binding BindingToDotNetQueue()
{
return BindingBuilder.bind(BlogDotNetQueue()).to(BlogExchange()).with("blog.dotNet");
}
@Bean
Binding BindingToAllQueue()
{
return BindingBuilder.bind(BlogAllQueue()).to(BlogExchange()).with("blog.#");
}
}
1.2.2.2监听者
@Component
public class BlogReceiver {
@RabbitListener(queues = "BlogJavaQueue")
public void receiverJava(String msg)
{
System.out.println("收到的JAVA消息是:" + msg);
}
@RabbitListener(queues = "BlogDotNetQueue")
public void receiverDotNet(String msg)
{
System.out.println("收到的DotNet消息是:" + msg);
}
@RabbitListener(queues = "BlogAllQueue")
public void receiverAll(String msg)
{
System.out.println("收到的ALL消息是:" + msg);
}
}
1.2.3使用
1.3fanout方式
忽略routekey,发送给所有的消费者
1.3.1生产者
1.3.1.1config
@Configuration
public class FanoutConfig {
@Bean
FanoutExchange FanoutExchange()
{
return new FanoutExchange("FanoutExchange");
}
}
1.3.1.2controller
@GetMapping("/fanout")
public String sendFanout(@RequestParam Map<String, Object> params)
{
String msg = params.get("msg").toString();
template.convertAndSend("FanoutExchange", null, msg);
return "OK";
}
1.3.2消费者
1.3.2.1 config
@Configuration
public class FanoutConfig {
@Bean
FanoutExchange FanoutExchange()
{
return new FanoutExchange("FanoutExchange");
}
@Bean
Queue FanoutQueue()
{
return new Queue("FanoutQueue");
}
@Bean
Queue FanoutQueue2()
{
return new Queue("FanoutQueue2");
}
@Bean
Binding BindFanout()
{
return BindingBuilder.bind(FanoutQueue()).to(FanoutExchange());
}
@Bean
Binding BindFanout2()
{
return BindingBuilder.bind(FanoutQueue2()).to(FanoutExchange());
}
}
1.3.2.2 监听者
@Component
public class FanoutReceiver {
@RabbitListener(queues = "FanoutQueue")
public void receiver(String msg)
{
System.out.println("收到的消息是:" + msg);
}
@RabbitListener(queues = "FanoutQueue2")
public void receiver2(String msg)
{
System.out.println("收到的消息是:" + msg);
}
}
1.3.3使用
1.4header方式
1.4.1 生产者
1.4.1.1 config
@Configuration
public class HeadersConfig {
@Bean
HeadersExchange headersExchange()
{
return new HeadersExchange("HeadersExchange");
}
}
1.4.1.2 controller
@GetMapping("/header")
public String sendHeader(@RequestParam Map<String, Object> params) {
String msg = params.get("msg").toString();
MessageProperties messageProperties = new MessageProperties();
if(params.get("token") != null)
{
messageProperties.setHeader("token", params.get("token").toString());
}
if(params.get("id") != null)
{
messageProperties.setHeader("id", params.get("id").toString());
}
Message message = new Message(msg.getBytes(), messageProperties);
template.convertAndSend("HeadersExchange", null, message);
return "OK";
}
1.4.2 消费者
1.4.2.1 config
package fastwave.cloud.demo.fastwavebizsubscriber.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class HeadersConfig {
@Bean
HeadersExchange headersExchange()
{
return new HeadersExchange("HeadersExchange");
}
@Bean
Queue headerQueue1()
{
return new Queue("headerQueue1");
}
@Bean
Queue headerQueue2()
{
return new Queue("headerQueue2");
}
@Bean
Queue headerQueue3()
{
return new Queue("headerQueue3");
}
@Bean
Queue headerQueue4()
{
return new Queue("headerQueue4");
}
@Bean
Binding bindHeaderQueue1()
{
return BindingBuilder.bind(headerQueue1()).to(headersExchange())
.whereAll("token", "id").exist();
}
@Bean
Binding bindHeaderQueue2()
{
return BindingBuilder.bind(headerQueue2()).to(headersExchange())
.whereAny("token", "id").exist();
}
@Bean
Binding bindHeaderQueue3()
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("token", "123");
map.put("id", "123");
return BindingBuilder.bind(headerQueue3()).to(headersExchange())
.whereAll(map).match();
}
@Bean
Binding bindHeaderQueue4()
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("token", "123");
map.put("id", "123");
return BindingBuilder.bind(headerQueue4()).to(headersExchange())
.whereAny(map).match();
}
}
1.4.2.2监听者
@Component
public class HeaderReceiver {
@RabbitListener(queues = "headerQueue1")
public void receiver(String msg)
{
System.out.println("收到的消息是:" + msg);
}
@RabbitListener(queues = "headerQueue2")
public void receiver2(String msg)
{
System.out.println("收到的消息是:" + msg);
}
@RabbitListener(queues = "headerQueue3")
public void receiver3(String msg)
{
System.out.println("收到的消息是:" + msg);
}
@RabbitListener(queues = "headerQueue4")
public void receiver4(String msg)
{
System.out.println("收到的消息是:" + msg);
}
}