我们已经把环境搭建好了,我们就来编写Provider和Consumer,我们首先 来编写Consumer,然后回到我们的代码当中,
我们看一下配置文件,在这个配置文件当中呢,配置了交换器的名称
mq.config.exchange=order.fanout
mq.config.queue.sms=order.sms
mq.config.queue.push=order.push
配置了短信队列名称,短信平台服务队列名称,这个是push服务队列名称,我们把它更新到自己的服务平台当中,
那么这两个名称大家应该知道表示什么了,是我们看到的这两个Queue的名称,我们打算给这两个Queue取这两个名字,
然后交换器起的名字,现在我们-直接拷贝direct项目下的,还是日志记录的Receiver,那我们是不是要把这两个Receiver
给改一下,首先名称我们不能叫InfoReceiver,比如我们先去做短信服务,SmsReceiver,然后ErrorReceiver,就是Push服务的,
PushReceiver,首先名字改好以后呢,接下来我们再看,在@RabbitListener我们该怎么没去做呢,首先第一个value这一块,绑定了
队列的名称,现在还是info这里是不是得改了,那这里绑谁呢,看我们的配置文件,这里是不是要绑sms所对应的value,因为我们
给队列起名叫sms吗,所以这块是sms,这是要改动的第一个地方,第二个地方是exchange,这个值不用动吧,这个key值不就是他吗,
所以这个名字就不用动,我们已经改好了
mq.config.exchange=order.fanout
关键是type这里,type我们这里用的还是direct,得把它改成fanout,然后再往后看,这里还有一个key的属性,这个key表示的是什么,
我们之前也说过,这个key就是标示路由键,其实我们通过写前两个案例,direct和topic的,应该也能体会到路由键的特点,其实路由键
的特点就是告诉交换器,现在我要将哪个信息交换到哪个队列当中,那我们现在用的fanout,它是广播模式,所有的队列都要有,既然所有
队列都要有了,还有区分这个概念吗,就没有了,没有区分这个概念,那么路由键就不需要存在了,是的,这块大家需要注意,在我们的fanout
交换器当中,不需要路由键的,如果你要给他加路由键,不是广播模式了,那就是根据你特定的路由键,将信息发送到指定的队列当中了,
就是特定的队列当中了,并不是将消息传递到所有的消息队列当中了,所以一定要注意,我们一定要把路由键给删掉,
@RabbitListener(
bindings=@QueueBinding(
value=@Queue(value="${mq.config.queue.sms}",autoDelete="true"),
exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT)
)
)
这样一个sms的服务就修改完了,然后我们在这里再改一改这个名字,
@RabbitHandler
public void process(String msg){
System.out.println("Sms........receiver: "+msg);
}
然后PushReceiver,这个也是同样的道理,首先需要把消息队列的名称给改一下,这个叫push
value="${mq.config.queue.push}"
应该是叫push,然后这儿,type=ExchangeTypes.FANOUT,这个应该是fanout,然后他也是没有key,没有路由键,有路由键的反而
收不到消息的,我们现在把这个代码粘到笔记当中
@RabbitListener(
bindings=@QueueBinding(
value=@Queue(value="${mq.config.queue.push}",autoDelete="true"),
exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT)
)
)
这个是smsReceiver,然后接下来是PushReceiver,这样我们的Consumer就编写完了,我们建立了两个模拟服务的类,
一个是SmsReceiver,一个是PushReceiver,然后把它标记一下,在这里,这一块${mq.config.queue.sms}是需要改变的,
第二个就是这个type=ExchangeTypes.FANOUT,交换器的类型,这儿也是,value="${mq.config.queue.push}",这块需要
改动一下,然后还有交换器的类型type=ExchangeTypes.FANOUT
4.0.0
com.learn
rabbitmq-fanout-consumer
0.0.1-SNAPSHOT
jar
org.springframework.boot
spring-boot-starter-parent
1.5.12.RELEASE
UTF-8
UTF-8
1.8
3.0.9.RELEASE
2.2.2
org.springframework.boot
spring-boot-starter-amqp
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
spring.application.name=rabbitmq-fanout-consumer
spring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=order.fanout
mq.config.queue.sms=order.sms
mq.config.queue.push=order.push
package com.learn;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 消息接收者
* @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);
}
}
package com.learn;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 消息接收者
* @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=ExchangeTypes.FANOUT)
)
)
public class PushReceiver {
/**
* 接收消息的方法。采用消息队列监听机制
* @param msg
*/
@RabbitHandler
public void process(String msg){
System.out.println("Push..........receiver: "+msg);
}
}
package com.learn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RabbitFanoutConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(RabbitFanoutConsumerApplication.class, args);
}
}