RabbitMQ 其中三种模式的测试
Connection 连接TCP/IP 一个应用一般只会 RabbitMQ 连接一个
Channel 寄生在 Connection 和 Exchange 消息队列相关
一个Channel对应着一个消息队列
Connection一般只有一个
多个消费者,消费同一个消息队列
非常有规律的轮流消费生产者发布的信息(Ribbon轮询机制)
多个消费者,同时消费一个 Rounting key ,但队列
不同
多个消费者都可以获取到消息,不会产生轮询
生产者只要生产一次,可以通过相同的 Rounting key,不同消息队列名称都可以消费这条消息
1、Topic
Producer 生产者:
——config:
注册 topic 交换机
@Configuration
public class TopicConfig {
@Bean
TopicExchange topicExchange() {
return new TopicExchange("topic-exchange");
}
}
——controller:
@RestController
@RequestMapping("/topic")
public class TopicController {
@Autowired
RabbitTemplate rabbitTemplate;
@RequestMapping("/gc/lang")
public String sendgclang(String msg) {
rabbitTemplate.convertAndSend("topic-exchange","gc.lang",msg);
return "/gc.lang 发送" + msg;
}
@RequestMapping("/gc/lang/java")
public String sendLangJava(String msg) {
rabbitTemplate.convertAndSend("topic-exchange","gc.lang.java",msg);
return "/gc/lang/java 发送" + msg;
}
@RequestMapping("/gc/lang/sql")
public String sendLangsql(String msg) {
rabbitTemplate.convertAndSend("topic-exchange","gc.lang.sql",msg);
return "/gc/lang/sql 发送" + msg;
}
@RequestMapping("/gc/lang/http")
public String sendLanghttp(String msg) {
rabbitTemplate.convertAndSend("topic-exchange","gc.lang.http",msg);
return "/gc/lang/http 发送" + msg;
}
@RequestMapping("/gc/db/socket")
public String senddbsocket(String msg) {
rabbitTemplate.convertAndSend("topic-exchange","gc.db.socket",msg);
return "/gc/db/socket 发送" + msg;
}
@RequestMapping("/gc/db/db")
public String senddbdb(String msg) {
rabbitTemplate.convertAndSend("topic-exchange","gc.db.db",msg);
return "/gc/db/db 发送" + msg;
}
}
consumer 消费者:
——config:
@Configuration
public class TopicConfig {
@Bean
TopicExchange topicExchange() {
return new TopicExchange("topic-exchange");
}
@Bean
Queue langQueue() {
return new Queue("gclang");
}
@Bean
Queue dbQueue() {
return new Queue("gcdb");
}
@Bean
Queue gcQueue() {
return new Queue("gc");
}
@Bean
Binding langBind() {
Binding binding = BindingBuilder.bind(langQueue())
.to(topicExchange())
.with("gc.lang.#");
return binding;
}
@Bean
Binding dbBind() {
Binding binding = BindingBuilder.bind(dbQueue())
.to(topicExchange())
.with("gc.db.#");
return binding;
}
@Bean
Binding gcBind() {
Binding binding = BindingBuilder.bind(gcQueue())
.to(topicExchange())
.with("gc.#");
return binding;
}
}
输出结果:
//消费方收到消息做业务处理,检测敏感字符
@Service
public class Topicservices {
@Autowired(required = false)
private StudentDao studentDao;
//Queue helloQ() {
// return new Queue("helloQ");
// }
@RabbitListener(queues = "gclang")
public void dolang(String msg) {
System.out.println(new Date() + "gc-lang" + msg);
}
@RabbitListener(queues = "gcdb")
public void dodb(String msg) {
System.out.println(new Date() + "gc-db" + msg);
}
/**
@RabbitListener(queues = "gc")
public void dogc(String msg) {
System.out.println(new Date() + "gc" + msg);
}
**/
}
2、Header(Map条件判断,信息字节传输)
生产者:
config
@Configuration
public class headerConfig {
@Bean
public HeadersExchange headersExchange() {
return new HeadersExchange("header-exchange");
}
}
controller:
@RestController
@RequestMapping("/head")
public class HeaderController {
@Autowired
RabbitTemplate rabbitTemplate;
@RequestMapping("/send")
public String send(Integer id,String token,String msg) {
System.out.println("id:" + id);
System.out.println("token:" + token);
System.out.println("msg:" + msg);
MessageProperties mp = new MessageProperties();
if (id != null) {
mp.setHeader("id",id);
}
if (token != null) {
mp.setHeader("token",token);
}
Message message = new Message(msg.getBytes(),mp);
rabbitTemplate.convertAndSend("header-exchange",null,message);
return "header send ==>id:" + id + "、token:" + token + "、msg:" + msg;
}
}
消费者:
config
(any、all、exist、match)
@Configuration
public class headerConfig {
@Bean
public HeadersExchange headersExchange() {
return new HeadersExchange("header-exchange");
}
@Bean
Queue queue1() {
return new Queue("q1");
}
@Bean
Queue queue2() {
return new Queue("q2");
}
@Bean
Queue queue3() {
return new Queue("q3");
}
@Bean
Queue queue4() {
return new Queue("q4");
}
@Bean
Binding binding1() { //全部存在 key
Binding b = BindingBuilder.bind(queue1())
.to(headersExchange()).whereAll("id","token").exist();
return b;
}
@Bean
Binding binding2() { //任意存在
Binding b = BindingBuilder.bind(queue2())
.to(headersExchange()).whereAny("id","token").exist();
return b;
}
@Bean
Binding binding3() {
Map<String,Object> map = new HashMap<>();
map.put("id",101);
map.put("token","t1");
Binding b = BindingBuilder.bind(queue3())
.to(headersExchange()).whereAll(map).match(); //value 101 t1
return b;
}
@Bean
Binding binding4() {
Map<String,Object> map = new HashMap<>();
map.put("id",101);
map.put("token","t1");
Binding b = BindingBuilder.bind(queue4())
.to(headersExchange()).whereAny(map).match(); //value 101 t1 任一
return b;
}
}
service:
//消费方收到消息做业务处理,检测敏感字符
@Service
public class Hederservices {
//Queue helloQ() {
// return new Queue("helloQ");
// }
@RabbitListener(queues = "q1")
public void doq1(String msg) {
System.out.println(new Date() + "q1 id token all" + msg);
}
@RabbitListener(queues = "q1")
public void doq2(String msg) {
System.out.println(new Date() + "q1_2 id token any" + msg);
}
@RabbitListener(queues = "q3")
public void doq3(String msg) {
System.out.println(new Date() + "q3 map id=101 token=t1 all value matche" + msg);
}
@RabbitListener(queues = "q4")
public void doq4(String msg) {
System.out.println(new Date() + "q4 map id=101 token=t1 value anymatche" + msg);
}
@RabbitListener(queues = "q1")
public void doTest(Message message, Channel channel) {
System.out.println("采用Message格式来接收数据...channel---" + channel.toString());
System.out.println("message:" + new String(message.getBody()) );
}
}
3、fanout(广播)
生产者:
config
@Configuration
public class fanoutConfig {
@Bean
FanoutExchange fanoutExchange() {
return new FanoutExchange("fanout-exchange");
}
}
controller:
无需指定key,只需要绑定模式和端口,即可接收
@RestController
@RequestMapping("/fanout")
public class fanoutController {
@Autowired
private AmqpTemplate amqpTemplate;
@RequestMapping("/send")
public String sendeMessage(String msg) {
amqpTemplate.convertAndSend("fanout-exchange","",msg);
return "/fanout/send 发送" + msg;
}
}
消费者:
config
@Configuration
public class fanoutConfig {
@Bean
FanoutExchange fanoutExchange() {
return new FanoutExchange("fanout-exchange");
}
@Bean
Queue fanout_queue() {
return new Queue("fanout_queue");
}
@Bean
Binding fanoutBind() {
Binding binding = BindingBuilder.bind(fanout_queue())
.to(fanoutExchange());
return binding;
}
}
services:
//消费方收到消息做业务处理,检测敏感字符
@Service
public class fanoutservices {
//Queue helloQ() {
// return new Queue("helloQ");
// }
@RabbitListener(queues = "fanout_queue")
public void do_fanout_queue(String msg) {
System.out.println(new Date() + "fanout_queue msg:" + msg);
}
}