我们已经把环境搭建好了,我们先从Consumer开始写起,看一下如何编写Consumer,回到我们的代码当中,然后我们来看一下我们的代码,这个代码是我们copy过来的,QueueConfig我们当时是用来创建一个队列,那么其实这个队列其实并不是我们每次启动都需要去new一个,这个是我们第一个入门案例,给大家讲RabbitMQ的时候,创建队列提到的一个Queue,但是在这个案例当中,你不new,我们RabbitMQ也会帮你去创建队列,对于这个队列来讲就不需要了,这个QueueConfig去掉,然后我们还有Sender,Sender我们也不要了,因为我们现在是接受方,所以把这两个去掉,我们留一个Consumer和启动类,我们再来看一下,然后注意看我们这个图,他现在应该有两个处理消息的服务,我们用一个项目来模拟两个服务,那我这里是不是得有两个类来去接收不同的消息,所以这块我还得创建一个Receive,咱们先改个名,这个Receiver叫什么呢,先叫InfoReceiver,然后我们再去拷贝一个叫ErrorReceiver,我们先写好再去拷贝,这样我们的代码修改量就少一些,首先先来看InfoReceiver里的代码,我们之前在写这个案例的时候呢,是在方法上加了一个@RabbitListener的注解,然后一个queues的一个名称,这样当你的队列里有消息进来了,这个注解主要是配置队列的一个监听,一旦有消息进来了,我们标记有@RabbitListener的方法,就会自动的从调用这个方法给传递过来,然后这个方法对这个消息做一个操作,这是我们之前写的案例,但是我们现在写的这个案例呢,这块要做一个改造,改造的原因是什么呢,是这样的,其实这个@RabbitListener我告诉大家,他不仅仅可以定义在方法上,他还可以定义在class上,定义在class上表示什么含义呢,就是在这个类下,有某个方法,能够从消息队列当中去获取消息,那么至于是哪个方法呢,因为一个类下可能会有很多方法,如果你把它定义到类上了,你在你类下的方法当中,就是能够去处理消息的方法上,还得加一个注解,这个注解叫什么呢,叫@RabbitHandler,那么你在哪个方法上加上这个注解了,表示未来某个队列有变化了,那么他就会调用这个方法,来消费消息,来把消息发送过来,我们这个方法处理这个消息就可以了,然后再来看,由于我们现在用的是direct的交换器,所以我们现在对于@RabbitListener这一块,需要一个更复杂的一个设置了,而不是原来的,因为什么呢,原来我们就直接一个队列,就一个hello-queue,但是我们现在这个图里,是有两个queue的,到底按照哪个交换器去处理信息,这些我们是不是都得给他去做一个配置,没错是这样的,所以这一块我们得把queues去掉了,这里我们要配什么呢,大家注意,这里配置起来内容可能会有点多,不要紧,我们按照他的格式去做就可以了,首先在@RabbitListener注解当中呢,还有一个属性,这个属性叫什么呢,叫bindings,这个binds属性表示什么呢,我们先说一下,这个属性是@RabbitListener注解下的一个属性,这个属性是什么呢,表示绑定队列,也就是说,我这个消费者去哪个队列里去取消息,你得告诉我他的位置,那么我们的绑定其实就是,告诉我们的消费者,去哪儿取那个消息,这也是完成一个绑定的,那么这个绑定都绑什么呢,首先来看第一个,我们先看@QueueBinding的注解,注意啊,接下来我们做的所有的配置,用的都是@QueueBinding下的属性来完成的,这里先跟大家说一下,我们现在在@RabbitListener里就用到了他的一个属性,他的一个属性就叫bindings,接下来我们所有的配置,都是基于@QueueBinding注解去完成的,所以这里他有好几个属性,所以这这块别搞混了,这个注解就是来完成一些绑定队列详细的配置,我们来看这里有什么属性呢,第一个这里有一个value属性,这个value属性是配置什么呢,就是需要我们指定queue的名字,叫什么,他在绑定之前需要知道你的queue叫什么名字,那么这块怎么给呢,还是通过一个叫queue的注解,然后这里也有一个value,这个value表示的就是,给你当前的queue,起个名字,那么我们现在在配置文件里,是不是给queue起好名了,注意看我们现在配置的是不是InfoReceiver,所以这里是不是应该把info的队列名字给他,说白了就是这个key对应的这个value,那如果你就直接这么拿过来给他,那么我们就放到配置文件里就没有意义了,我们目的不就是通过key给value,这样以后我们以后改队列的名称,通过配置文件修改就更方便一些,所以这样就可以防止硬编码的问题,这块我肯定不能给他,我应是给这个key,那这个key我怎么给呢,也是同样的道理,通过${},就可以把这个信息取出来,这是第一个,对于queue的属性当中,value队列的名称,这个属性表示的是配置队列名称,然后在queue当中还有一个属性,叫autoDelete,他要的是一个布尔类型,这个属性是什么意思呢,就是表示你当前的队列,是不是一个临时队列,是否是一个可删除的临时队列,这个我们就是一个临时的队列,你不会都不会有问题,这是Queue下的两个属性,然后咱们再来看,我们现在除了用到value属性以外,我们还要用到@QueueBinding里的另一个属性,第二个属性是谁呢,是exchange,大家注意,我们现在用的属性都是@QueueBinding,属性全都是@QueueBinding里的,包括value和exchange都是他的,那么exchange里都是配置什么呢,就是配置交换器的,这个属性是配置交换器,那么怎么配置交换器呢,我们也得用一个注解,这个注解就叫@Exchange,然后在这个注解当中呢,也有一个value,这个value指的是什么呢,为交换器起个名字,就是你的交换器得有个名字,然后这个名字我们是不是已经起好了,就是配置文件里的log.direct,那同样我们把这个key拿过来,然后放到value当中,然后在exchange当中呢,他有了一个value以外,他还有一个属性,叫type,这个type属性是配置什么的呢,指定具体的交换器类型,就是你必须要指定你的交换器是什么类型的,那么怎么指定的呢,有一个常量类,叫ExchangeTypes,在这里罗列出了当前所支持的交换器类型,我们选Direct就可以了,这样我们就完成了一个在消费者这一块,队列和交换器的一个绑定,也就是我们看图,完成了这一块,但是现在还少一个路由键,所以我们还得配置一个路由键,再来一个属性,这个属性叫什么呢,叫key,这个属性也是@QueueBinding下的,然后这个路由键是什么呢,这个就是我们配置文件里的这个路由键,所以我们把info的路由键拿过来,这样就搞定了,这会配置完毕以后,其实对于InfoReceiver消费Receiver来讲,就知道去哪个交换器下,所绑定的哪个队列,根据什么样的路由规则,去取消息,这样就可以取出想要的消息了,就这样的一个过程,这样对于info的代码就写完了然后在ErrorReceiver里面,我们要把info的改成error就可以了,就是我们下面这个,第一个看队列名称,我们的key叫error,不就是他mq.config.queue.error,然后还有一个路由key,也是把info改成error就可以了,其他的都不用动,对于error级别的我们也是用的发布订阅器
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn</groupId><artifactId>rabbitmq-direct-consumer</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version><relativePath/> </parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><thymeleaf.version>3.0.9.RELEASE</thymeleaf.version><thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 这个插件,可以将应用打包成一个可执行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
spring.application.name=rabbitmq-direct-consumerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=log.direct
mq.config.queue.info=log.info
mq.config.queue.info.routing.key=log.info.routing.key
mq.config.queue.error=log.error
mq.config.queue.error.routing.key=log.error.routing.key
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.info}",autoDelete="true"),exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.DIRECT),key="${mq.config.queue.info.routing.key}"))
public class InfoReceiver {/*** 接收消息的方法。采用消息队列监听机制* @param msg*/@RabbitHandlerpublic void process(String msg){System.out.println("Info........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.error}",autoDelete="true"),exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.DIRECT),key="${mq.config.queue.error.routing.key}"))
public class ErrorReceiver {/*** 接收消息的方法。采用消息队列监听机制* @param msg*/@RabbitHandlerpublic void process(String msg){System.out.println("Error..........receiver: "+msg);}
}
package com.learn;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class RabbitDirectConsumerApplication {public static void main(String[] args) {SpringApplication.run(RabbitDirectConsumerApplication.class, args);}
}

Direct交换器-编写消费者相关推荐

  1. Direct交换器-编写生产者

    我们来编写消息的生产者,Provider,回到我们的代码当中,Provider配置文件已经配置好了,在这里Receiver就不要了,只要Sender就可以了,然后我们来看一下Sender的代码,这是我 ...

  2. Topic交换器-编写消费者

    我们接着来编写Consumer,回到我们的代码当中,打开我们的topic-consumer,配置文件我们已经改完了,先放到这里,看我们的代码,我们先改第一个InfoReceiver,InfoRecei ...

  3. Fanout交换器-编写消费者

    我们已经把环境搭建好了,我们就来编写Provider和Consumer,我们首先 来编写Consumer,然后回到我们的代码当中,我们看一下配置文件,在这个配置文件当中呢,配置了交换器的名称mq.co ...

  4. rabbitmq direct 多个消费者_RabbitMQ从零开始

    什么是RabbitMQ RabbitMQ是一个由ErLang语言编写的实现了AMQP(高级消息队列协议)的开源消息中间件 .RabbitMQ 支持消息的持久化.事务.拥塞控制.负载均衡等特性. 为什么 ...

  5. 使用idea编写消费者,接收生产者的持续日志输出【小案例】(三)

    在   用idea编写代码作为生产者,Kafka接收其[持续]发来的广告日志信息[小案例](二) https://georgedage.blog.csdn.net/article/details/10 ...

  6. Fanout交换器-编写生产者

    我们再来编写生产者,Provider,这里我们已经把消费者给写好了,一个SmsReceiver,一个PushReceiver,先改一下,这是push receiver@RabbitHandler pu ...

  7. Topic交换器-编写生产者

    我们已经把环境搭建好了,我们就来编写具体代码,我们首先来编写Provider,消息提供者的代码,编写Provider,我们打开我们的项目,配置文件先关掉,看我们的Provider,Provider这里 ...

  8. RabbitMq | springboot (路由模式RoutingKey)整合Direct交换器

    生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要制定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 引入依赖: <dependency><gr ...

  9. rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式

    Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct 模式可以使用 RabbitMQ 自带的 Exchange: de ...

最新文章

  1. 并发安全Sync包的使用
  2. 浏览器中xhr选项是做什么用的呢_XHR和AJAX终于搞懂了!!
  3. 【推荐系统】基于MovieLens数据集实现的协同过滤算法
  4. DCMTK:测试DcmItem的newDicomElement()辅助方法
  5. python编写代码时零_python – KeyError:运行打包代码时为0L
  6. JavaScript之Object
  7. electron 打印需要联网的吗?_英语四六级考试准考证怎么打印,需要彩打吗
  8. php fping,【Linux 命令】fping ping 包间隔时间详解
  9. nginx 配置入门 进行跨域
  10. 【问链财经-区块链基础知识系列】 第十六课 区块链将变革教育产业,未来有六大应用方向
  11. HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看
  12. 软件著作权申请注意事项——常见问题[详细版,不断补充中]
  13. python 还原九宫格图片_python生成九宫格图片
  14. 一篇文让你看懂NB-IoT、LoRa、eMTC、Sigfox及ZigBee的应用场景
  15. wordpress主题转html,WordPress主题的 HTML静态页面模板制作教程
  16. android查看当前手机中的进程
  17. 判断NSString是否含有某字符rangeOfString
  18. ps无法在此计算机上运行,解决PS打开图片"无法完成请求,因为文件格式模块不能解析该文件"...
  19. 密码暴力破解漏洞(kali crunch)
  20. 更改快速启动栏右键后的最近访问数量

热门文章

  1. NYIST 1006 偷西瓜
  2. nand ubi -4 kernel和mtd
  3. the Open Source Community
  4. VGA timing information
  5. JavaScript jQuery获取radio/下拉框的选中值
  6. Java 读取 .properties 配置文件的几种方式
  7. [Java 并发编程实战] 设计线程安全的类的三个方式(含代码)
  8. docker 服务器engin开放2376端口给pycharm连接
  9. mysql数据库导出模型到powerdesigner,PDM图形窗口中显示数据列的中文注释
  10. javascript系统时间