生产者
@RunWith(SpringRunner.class)//用springrunning替代Junit原生的runner
@SpringBootTest(classes = RabbitApplication.class)
public class ProductTest {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 直接模式
* 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
* 1.一般情况可以使用rabbitMQ自带的Exchange:""(该Exchange的名字为空字符串,下文称其为default Exchange)
* 2.这种模式下不需要将Exchange进行任何绑定(binding)操作
* 3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字
* 4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃
*/
@Test
public void sendMsgDirect(){
rabbitTemplate.convertAndSend("routingkey","直接模式测试");
}
/**
* 分裂模式
* 任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有 Queue上。
* 1.可以理解为路由表的模式
* 2.这种模式不需要RouteKey
* 3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个 Queue,一个Queue可以同多个Exchange进行绑定。
* 4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。
*/
@Test
public void sendMsgFanout(){
rabbitTemplate.convertAndSend("exchange", "", "分裂模式测试");
}
/**
* 主题模式
* 任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue 上
* 1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一 个“标题”(RouteKey),
* Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的 队列。
* 2.这种模式需要RouteKey,也需要提前绑定Exchange与Queue。
* 3.在进行绑定时,要提供一个该队列关心的主题,
* 如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
* 4.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息
* 交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,
* 实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消息。
* routingKey:
* 符号 # 匹配一个或多个词,#.log.# 表示包含log的所有
* 符号 * 表示仅仅匹配一个词,例:hello.*,hello.a可以匹配,hello.a.b不可以
*/
@Test
public void sendMsgTopic(){
rabbitTemplate.convertAndSend("exchange", "hello.#", "主题模式测试");
}
直接模式消费者
@Component
@RabbitListener(queues = "routingkeyDirect")
public class CustomerDirect {
/**
* 开启多个消费者工程,测试运行消息生产者工程,会发现只有一个消费者工程可以接收 到消息。
*/
@RabbitHandler
public void getMsgDirect(String msg){
System.out.printf("(Direct)直接模式消费消息:"+msg);
}
}
分裂模式消费者
@Component
@RabbitListener(queues = "routingkeyFanout1")
public class CustomerFanout1 {
/**
* 开启多个消费者工程,测试运行分裂生产者工程,会发现所有消费者工程可以接收到消息。
*/
@RabbitHandler
public void getMsgFanout(String msg){
System.out.printf("(Fanout)分裂模式 消费消息:"+msg);
}
}
主题模式消费者
@Component
@RabbitListener(queues = "hello.abc")
public class CustomerDirect {
/**
* 开启多个消费者工程,测试运行消息生产者工程,会发现只有queues匹配消费者工程可以接收到消息。
*/
@RabbitHandler
public void getMsgDirect(String msg){
System.out.printf("(Topic)主题模式消费消息:"+msg);
}
}