消息队列 随笔 1-三种传播方式&Rabbit-Client-Demo

0.一切从这个日志demo开始说起…

配置文件

spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456

配置类

/**
* 创建消息队列
* @author Administrator
**
/
@Configuration
public class QueueConfig {
	/**
	* 创建队列
	* @return
	*/
	@Bean
	public Queue createQueue(){
		return new Queue("hello-queue");
	}
}

启动类

@SpringBootApplication
public class SpringbootServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringbootServerApplication.class,args);
	}
}

简单的生产者类

/**
* 消息发送者
* @author Administrator
**
/
@Component
public class Sender {
	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	/*
	* 发送消息的方法
	*/
	public void send(String msg){
	//向消息队列发送消息
	//参数一:队列的名称。
	//参数二:消息
	this.rabbitAmqpTemplate.convertAndSend("hello-queue",msg);
	}
}

同样不能再简单的 消费者类

/**
* 消息接收者
* @author Administrator
**
/
@Component
public class Receiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitListener(queues="hello-queue")
	public void process(String msg){
		System.out.println("receiver: "+msg);
	}
}

手动触发消息产出的测试类

/**
* 消息队列测试类
* @author Administrator
**
/
@RunWith(SpringRunner.class)
@SpringBootTest(classes=SpringbootServerApplication.class)
public class QueueTest {
	@Autowired
	private Sender sender;
	/*
	* 测试消息队列
	*/
	@Test
	public void test1(){
		this.sender.send("Hello RabbitMQ");
	}
}

1. Direct 分布与订阅

在这里插入图片描述

1.1 provider

配置文件

spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=log.direct
#info 路由键
mq.config.queue.info.routing.key=log.info.routing.key
#error 路由键
mq.config.queue.error.routing.key=log.error.routing.key
#error 队列名称
mq.config.queue.error=log.error

发布类

/**
* 消息发送者
* @author Administrator
*
*/
@Component
public class Sender {
	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	//exchange 交换器名称
	@Value("${mq.config.exchange}")
	private String exchange;
	//routingkey 路由键
	@Value("${mq.config.queue.error.routing.key}")
	private String routingkey;
	/*
	* 发送消息的方法
	*/
	public void send(String msg){
	//向消息队列发送消息
	//参数一:交换器名称。
	//参数二:路由键
	//参数三:消息
	this.rabbitAmqpTemplate.convertAndSend(this.exchange,
		this.routingkey, msg);
	}
}

1.2 consumer

配置文件

spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=log.direct
#info 队列名称
mq.config.queue.info=log.info
#info 路由键
mq.config.queue.info.routing.key=log.info.routing.key
#error 队列名称
mq.config.queue.error=log.error
#error 路由键
mq.config.queue.error.routing.key=log.error.routing.key

订阅类1
info级别的日志消费者

/**
* 消息接收者
* @author Administrator
* @RabbitListener bindings:绑定队列
* @QueueBinding value:绑定队列的名称
* exchange:配置交换器
*
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
*
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*/
@Component
@RabbitListener(
	bindings=@QueueBinding(
		value=@Queue(value="${mq.config.queue.info}",autoDelete="true"),
		exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.DIRECT),
		key="${mq.config.queue.info.routing.key}"
	)
)
public class InfoReceiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitHandler
	public void process(String msg){
		System.out.println("Info........receiver: "+msg);
	}
}

订阅类2
error级别的日志消费者

/**
* 消息接收者
* @author Administrator
* @RabbitListener bindings:绑定队列
* @QueueBinding value:绑定队列的名称
* exchange:配置交换器
*
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
*
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*/
@Component
@RabbitListener(
	bindings=@QueueBinding(
		value=@Queue(value="${mq.config.queue.error}",autoDelete="true"),
		exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.DIRECT),
		key="${mq.config.queue.error.routing.key}"
	)
)
public class ErrorReceiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitHandler
	public void process(String msg){
		System.out.println("Error..........receiver: "+msg);
	}
}

2.Topic 主题匹配

在这里插入图片描述

2.1 provider

配置文件

spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=log.topic

发送者类1 用户模块的消息发送者

/**
* 消息发送者
* @author Administrator
**
/
@Component
public class UserSender {
	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	//exchange 交换器名称
	@Value("${mq.config.exchange}")
	private String exchange;
	/*
	* 发送消息的方法
	*/
	public void send(String msg){
		//向消息队列发送消息
		//参数一:交换器名称。
		//参数二:路由键
		//参数三:消息
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.
		log.debug", "user.log.debug....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.
		log.info", "user.log.info....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.
		log.warn","user.log.warn....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.
		log.error", "user.log.error....."+msg);
	}
}

发送者类2 商品模块的消息发送者

/**
* 消息发送者
* @author Administrator
**
/
@Component
public class ProductSender {
	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	//exchange 交换器名称
	@Value("${mq.config.exchange}")
	private String exchange;
	/*
	* 发送消息的方法
	*/
	public void send(String msg){
		//向消息队列发送消息
		//参数一:交换器名称。
		//参数二:路由键
		//参数三:消息
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"produ
		ct.log.debug", "product.log.debug....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"produ
		ct.log.info", "product.log.info....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"produ
		ct.log.warn","product.log.warn....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"produ
		ct.log.error", "product.log.error....."+msg);
	}
}

发送者类3 订单模块的消息发送者

/**
* 消息发送者
* @author Administrator
**
/
@Component
public class OrderSender {
	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	//exchange 交换器名称
	@Value("${mq.config.exchange}")
	private String exchange;
	/*
	* 发送消息的方法
	*/
	public void send(String msg){
		//向消息队列发送消息
		//参数一:交换器名称。
		//参数二:路由键
		//参数三:消息
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order
		.log.debug", "order.log.debug....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order
		.log.info", "order.log.info....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order
		.log.warn","order.log.warn....."+msg);
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order
		.log.error", "order.log.error....."+msg);
	}
}

2.2 consumer

配置文件

spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=log.topic
#info 队列名称
mq.config.queue.info=log.info
#error 队列名称
mq.config.queue.error=log.error
#log 队列名称
mq.config.queue.logs=log.all

info级别的日志消费者

/**
* 消息接收者
* @author Administrator
* @RabbitListener bindings:绑定队列
* @QueueBinding value:绑定队列的名称
* exchange:配置交换器
*
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
*
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*/
@Component
@RabbitListener(
	bindings=@QueueBinding(
		value=@Queue(value="${mq.config.queue.info}",autoDelete="true"),
		exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
		key="*.log.info"
	)
)
public class InfoReceiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitHandler
	public void process(String msg){
		System.out.println("......Info........receiver:"+msg);
	}
}	

error级别的日志消费者

/**
* 消息接收者
* @author Administrator
* @RabbitListener bindings:绑定队列
* @QueueBinding value:绑定队列的名称
* exchange:配置交换器
*
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
*
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*/
@Component
@RabbitListener(
	bindings=@QueueBinding(
		value=@Queue(value="${mq.config.queue.error}",autoDelete="true"),
		exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
		key="*.log.error"
	)
)
public class ErrorReceiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitHandler
	public void process(String msg){
		System.out.println("......Error........receiver:"+msg);
	}
}

所有log级别的日志消费者

/**
* 消息接收者
* @author Administrator
* @RabbitListener bindings:绑定队列
* @QueueBinding value:绑定队列的名称
* exchange:配置交换器
*
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
*
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*/
@Component
@RabbitListener(
	bindings=@QueueBinding(
		value=@Queue(value="${mq.config.queue.logs}",autoDelete="true"),
		exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
		key="*.log.*"
	)
)
public class LogsReceiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitHandler
	public void process(String msg){
		System.out.println("......All........receiver:"+msg);
	}
}

触发消息产出的测试类

/**
* 消息队列测试类
* @author Administrator
**
/
@RunWith(SpringRunner.class)
@SpringBootTest(classes=SpringbootServerApplication.class)
public class QueueTest {
	@Autowired
	private UserSender usersender;
	@Autowired
	private ProductSender productsender;
	@Autowired
	private OrderSender ordersender;
	/*
	* 测试消息队列
	*/
	@Test
	public void test1(){
		this.usersender.send("UserSender.....");
		this.productsender.send("ProductSender....");
		this.ordersender.send("OrderSender......");
	}
}

3.Fanout 广播

在这里插入图片描述

3.1 provider

配置文件

spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=order.fanout

消息发送者

/**
* 消息发送者
* @author Administrator
**
/
@Component
public class Sender {
	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	//exchange 交换器名称
	@Value("${mq.config.exchange}")
	private String exchange;
	/*
	* 发送消息的方法
	*/
	public void send(String msg){
		//向消息队列发送消息
		//参数一:交换器名称。
		//参数二:路由键
		//参数三:消息
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,"",
		msg);
	}
}

3.2 consumer

配置文件

spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=order.fanout
#短信服务队列名称
mq.config.queue.sms=order.sms
#push 服务队列名称
mq.config.queue.push=order.push

消息消费者1

/**
* 消息接收者
* @author Administrator
* @RabbitListener bindings:绑定队列
* @QueueBinding value:绑定队列的名称
* exchange:配置交换器
* key:路由键
*
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
*
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*/
@Component
@RabbitListener(
	bindings=@QueueBinding(
		value=@Queue(value="${mq.config.queue.sms}",autoDelete="true"),
		exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT)
	)
)
public class SmsReceiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitHandler
	public void process(String msg){
		System.out.println("Sms........receiver: "+msg);
	}
}

消息消费者2

/**
* 消息接收者
* @author Administrator
* @RabbitListener bindings:绑定队列
* @QueueBinding value:绑定队列的名称
* exchange:配置交换器
*
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
*
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*/
@Component
@RabbitListener(
	bindings=@QueueBinding(
		value=@Queue(value="${mq.config.queue.push}",autoDelete="true"),
		exchange=@Exchange(value="${mq.config.exchange}",type=Excha
		ngeTypes.FANOUT)
	)
)
public class PushReceiver {
	/**
	* 接收消息的方法。采用消息队列监听机制
	* @param msg
	*/
	@RabbitHandler
	public void process(String msg){
		System.out.println("Push..........receiver: "+msg);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肯尼思布赖恩埃德蒙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值