默认交换机的本质就是名称为空的直连交换机
直连交换机是根据消息携带的路由键、将消息投递给对应队列的。
工作流程:
将一个队列绑定在某个交换机上,同时赋予该绑定一个路由键,当一个携带着路由键为R的消息,被发送给直连交换机时,交换机会把他路由给绑定值同样为R的队列
具体实现:
首先我们需要一个交换机的配置类:
package com.chuxin.fight.demo.rabbitmq.direct;
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;
/**
* @FileName: RabbitDirectConfig
* @Description: 配置队列
* @author: <a href="mailto: muyuanpei@camelotchina.com">myp</a>
* @create: 2018-11-13 17:15
* @Copyright: (c) 2018年 北京柯莱特科技有限公司
*/
@Configuration
public class RabbitDirectConfig {
@Bean
public Queue helloQueue() {
return new Queue("hello");
}
@Bean
public Queue directQueue() {
return new Queue("direct");
}
//-------------------配置默认的交换机模式,可以不需要配置以下-----------------------------------
@Bean
DirectExchange directExchange() {
return new DirectExchange("directExchange");
}
//绑定一个key "direct",当消息匹配到就会放到这个队列中
@Bean
Binding bindingExchangeDirectQueue(Queue directQueue, DirectExchange directExchange) {
return BindingBuilder.bind(directQueue).to(directExchange).with("direct");
}
// 推荐使用 helloQueue() 方法写法,这种方式在 Direct Exchange 模式 多此一举,没必要这样写
//---------------------------------------------------------------------------------------------
}
然后编写对应的接受者:
package com.chuxin.fight.demo.rabbitmq.direct;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* @FileName: DirectReceiver
* @Description: 监听队列--接受者
* @author: <a href="mailto: muyuanpei@camelotchina.com">myp</a>
* @create: 2018-11-13 17:19
* @Copyright: (c) 2018年 北京柯莱特科技有限公司
*/
@Component
@RabbitListener(queues = "hello")
public class DirectReceiver {
@RabbitHandler
public void process(String message) {
System.out.println("接收者 DirectReceiver," + message);
}
}
package com.chuxin.fight.demo.rabbitmq.direct;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* @FileName: HelloReceiver
* @Description: 监听队列--接受者
* @author: <a href="mailto: ***@163.com">myp</a>
* @create: 2018-11-13 17:18
*/
@Component
@RabbitListener(queues = "hello")
public class HelloReceiver {
@RabbitHandler
public void process(String message) {
System.out.println("接收者 helloReceiver," + message);
}
}
最后编写测试类,测试我们的配置和编码:
package com.chuxin.fight.demo.rabbitmq.direct;
import com.chuxin.fight.demo.DemoApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @FileName: RabbitDirectTest
* @Description: 直连交换机模式
* @author: <a href="mailto: muyuanpei@camelotchina.com">myp</a>
* @create: 2018-11-13 17:23
* @Copyright: (c) 2018年 北京柯莱特科技有限公司
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class RabbitDirectTest {
@Autowired
private AmqpTemplate rabbitTemplate;
@Test
public void sendHelloTest() {
String context = "发送的第一个消息";
//String context2 = "发送的第二个消息";
//String context3 = "发送的第三个消息";
String routeKey = "hello";
context = "routeKey:" + routeKey + ",context:" + context;
System.out.println("sendHelloTest : " + context);
this.rabbitTemplate.convertAndSend(routeKey, context);
//this.rabbitTemplate.convertAndSend(routeKey, context2);
//this.rabbitTemplate.convertAndSend(routeKey, context3);
}
@Test
public void sendDirectTest() {
String context = "此消息在,默认的交换机模式队列下,有 DirectReceiver 可以收到";
String routeKey = "direct";
String exchange = "directExchange";
context = "context:" + exchange + ",routeKey:" + routeKey + ",context:" + context;
System.out.println("sendDirectTest : " + context);
// 推荐使用 sendHello() 方法写法,这种方式在 Direct Exchange 多此一举,没必要这样写
this.rabbitTemplate.convertAndSend(exchange, routeKey, context);
}
}
这样就完成了一个直连交换机的配置与编码。由于自己的服务器过期了,不能展示相应的打印结果。。。
网友评论